Правильность константы: константа символа константы * константа константа GetName (//материал);

Прием хранимой процедуры - то, что можно назвать их от оператора INSERT. Я нашел это очень полезным, когда я работал над базой данных SQL Server.

CREATE TABLE #toto (v1 int, v2 int, v3 char(4), status char(6))
INSERT #toto (v1, v2, v3, status) EXEC dbo.sp_fulubulu(sp_param1)
SELECT * FROM #toto
DROP TABLE #toto
6
задан Bill the Lizard 20 September 2012 в 20:54
поделиться

7 ответов

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

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

const char const *const

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

(Думайте об этом как о методе только для чтения.)

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

const char const *const

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

(Думайте об этом как о методе только для чтения.)

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

const char const *const

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

6
ответ дан 9 December 2019 в 20:45
поделиться

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

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

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

2
ответ дан 9 December 2019 в 20:45
поделиться

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

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

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

  • const T * - указатель на const T
  • T * const - константный указатель на T
2
ответ дан 9 December 2019 в 20:45
поделиться

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

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

«ComeauTest.c», строка 4: error: type квалификатор указан более одного раза
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';

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

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

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

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

const Person& p;
p.GetName();

Без этой константы приведенный выше код завершится ошибкой.

1
ответ дан 9 December 2019 в 20:45
поделиться

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

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

3 - метод const, не разрешено изменять члены или вызывать какие-либо неконстантные методы.

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

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

0
ответ дан 9 December 2019 в 20:45
поделиться

Дано:

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

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

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

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

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

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

0
ответ дан 9 December 2019 в 20:45
поделиться

last const:

  • Функция не изменяет частные значения класса

одну после последней const:

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

second const:

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

Первое:

  • Понятия не имею?

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

0
ответ дан 9 December 2019 в 20:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: