Правильность констант: const char const * const GetName const (// stuff); - PullRequest
6 голосов
/ 02 декабря 2009

Помечено как домашнее задание, потому что это был вопрос на промежуточный срок, который я написал, на который я не понимаю ответа. Меня попросили объяснить назначение каждого const в следующем утверждении:

const char const * const GetName() const { return m_name; };

Итак, каково объяснение каждого из этих минусов?

Ответы [ 8 ]

6 голосов
/ 02 декабря 2009

Возьми их справа. Тот, что перед ;, сообщает клиенту, что это уровень проектирования, то есть он не изменяет состояние объекта. (Думайте об этом как о методе только для чтения.)

Хорошо, теперь возвращаемое значение:

const char const *const

Это постоянный указатель на хорошо ... вот и мы, бум! У вас есть лишняя const - синтаксическая ошибка. Следующие значения эквивалентны: const T или T const. Если вы берете const, вы получаете постоянный указатель на постоянные символы. Это помогает?

2 голосов
/ 02 декабря 2009

(1) const char (2) const * (3) const GetName () {return m_name; } (4) const;

  1. Содержимое массива char является const. Это хорошо, когда вы возвращаете указатель на член объекта. Поскольку вы даете указатель на вашего участника для третьей стороны, вы хотите предотвратить его изменение извне.
  2. Эта форма используется не часто и по существу совпадает с (1)
  3. Наш указатель на массив символов является константным, поэтому вы не можете изменить, куда указывает указатель.
  4. он квалифицирует сам GetName (), что означает, что метод, таким образом, не меняет класс, который он также применял. Таким образом, он может быть вызван только для константного объекта этого типа. Эта форма обычно используется как GetName (...) const.

Как уже упоминалось в других ответах, уловка «запомнить» это читается справа налево:

  • const T * - указатель на const T
  • T * const - постоянный указатель на T
2 голосов
/ 02 декабря 2009

У вас есть еще одно const, чем разрешено синтаксически, этот код не будет компилироваться. Удалите «const» после «char» и перед «*». Кроме того, последний const должен предшествовать телу функции. Это помогает читать такие вещи справа налево.

const char * const GetName() const { return m_name; };

У вас есть функция const (то есть функция не изменяет состояние класса.), Которая возвращает указатель const на символ const.

1 голос
/ 07 января 2011

Возможно, вы пропустили символ "*" перед вторым ключевым словом const.

const char * const * const GetName() const { return m_name; };

Таким образом, это означает, что функция возвращает постоянный указатель на постоянный указатель на постоянный символ.

1 голос
/ 02 декабря 2009

Редактировать: Похоже, я неправильно вставил код в Comeau или он был отредактирован в исходном ответе, чтобы быть правильным. В любом случае я сохраняю ответ ниже, как если бы код был неправильным.

Онлайн-компилятор Comeau дает следующие результаты:

"ComeauTest.c", строка 4: ошибка: тип спецификатор указан более одного раза
const char const * const GetName () { вернуть m_name; } const; ^

"ComeauTest.c", строка 4: предупреждение: тип классификатор по типу возврата бессмысленный const char const * const GetName () {return m_name; } const; ^

"ComeauTest.c", строка 4: ошибка: декларация ничего не декларирует const char const * const GetName () { вернуть m_name; } const;

Это означает, что ваше утверждение искажено.

const char const * const GetName() { return m_name; } const;

Первые и вторые константы означают одно и то же. Вы не можете указывать один и тот же спецификатор более одного раза, поэтому один из них должен быть удален для компиляции кода. Обе эти константы указывают, что значения, на которые указывает указатель, возвращаемый GetName, не могут быть изменены, что делает код, подобный этому, недействительным:

const char* name = c.GetName();
name[0] = 'a';

Третье const указывает, что указатель, возвращаемый самим GetName (), не может быть изменен, но, как указывает Comeau, это ничего не дает для возвращаемого значения, поскольку возвращаемое значение является копией указателя, а не указателя и может быть назначен неконстантному указателю.

Четвертый const не на своем месте, он должен находиться между GetName и телом функции следующим образом:

const char* GetName() const { return m.name; }

Это const указывает, что ни один из членов класса не будет изменен во время выполнения GetName. Предполагая, что GetName является членом класса Person, этот код будет разрешен:

const Person& p;
p.GetName();

Без этого const вышеприведенный код потерпит неудачу.

0 голосов
/ 02 декабря 2009

Дано:

const char const * const GetName() const { return m_name; };

Первое и второе const эквивалентны, но разрешен только один из них - то есть вы можете поставить const до или после типа (в данном случае char), но только один или другой, но не оба. Либо, однако, говорит, что символы, на которые указывает указатель, не могут быть записаны.

const после '*' означает, что указатель, возвращаемый функцией, сам не может быть изменен. Это редко встречается в типе возвращаемого значения - возвращаемое вами значение является значением, которое нельзя изменить ни в коем случае (обычно оно просто присваивается некоторой переменной). Это может, однако, иметь значение в других контекстах.

Третий const разрешен только для функции member . Он говорит, что при вызове этой функции полученный указатель this будет T const * const, а не T * const, поэтому функция-член может изменять только static или mutable члены объекта, и если он вызывает другие функции-члены, они также должны быть const. Однако есть предостережение, что он также может отбрасывать константность, и в этом случае он может изменять то, что считает нужным (с дополнительным предупреждением, что если объект изначально был определен как const, а не просто иметь const указатель на обычный (неконстантный) объект, результаты будут неопределенными).

0 голосов
/ 02 декабря 2009

const (1) char const (2) * const GetName () {return m_name; } const (3);

const char * const result = aaa.GetNAme ();

3 - константный метод, не допускается ни изменять члены, ни вызывать какие-либо неконстантные методы.

1 - не позволяет изменять внутри указателя, т.е. * result = ..

2 - не позволяет перемещать указатель, то есть результат = NULL

0 голосов
/ 02 декабря 2009

последняя константа:

  • Функция не меняет рядовых класса

один за последним const:

  • Это постоянный указатель (то есть место , на которое он указывает, является постоянным)

второй констант:

  • Функция возвращает константный символ (т. Е. Содержимое символа является постоянным)

Первый:

  • Не знаете?

Итак, чтобы завершить: Функция возвращает постоянный указатель (всегда в одном и том же месте) на постоянный символ (всегда с одинаковым содержимым), и функция не изменяет состояние класса.

...