Быстрый о const в C ++ - PullRequest
       26

Быстрый о const в C ++

2 голосов
/ 28 февраля 2012

Я понимаю, что правильный способ объявить возвращаемый тип const - написать:

int foo() const;

Но в некоторых случаях это не работает для меня, тогда я могу использовать:

const int foo();

В чем разница между ними и почему я могу использовать последний во всех случаях, но не в первом.

Примером, когда я не могу использовать первый, является случай, когда я хочувернуть массив bools, которые определены вне метода.

С уважением,

/ Markus

Ответы [ 8 ]

6 голосов
/ 28 февраля 2012

Я понимаю, что правильный способ объявить тип возврата const - написать:

int foo() const;

Ваше понимание неверно.Выше объявляется foo() как const функция-член.Это не имеет ничего общего с типом возврата foo().

Для получения дополнительной информации см. Какова семантика функции-члена const?

3 голосов
/ 28 февраля 2012

int foo() const; говорит, что foo() как функция-член не будет изменять данные-члены класса.

const int foo(); говорит, что foo() - это функция, возвращаемое значение которой равно const int (действительно int).

2 голосов
/ 28 февраля 2012

Во-первых,

int foo() const;

и

int foo();

- это пара функций, которые вы можете определить как функцию-член класса.Все возвращаемые типы: int .

Когда const объект этого класса вызывает функцию foo () , первый ответит.

Эту функцию

const int foo();

можно определить везде.тип возвращаемого значения const int , поэтому необходимо назначить функцию переменной const int .

2 голосов
/ 28 февраля 2012

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

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

2 голосов
/ 28 февраля 2012

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

1 голос
/ 28 февраля 2012

const изменяет то, что находится непосредственно перед ним;в

int foo() const;

это постоянная функция, а не возвращаемое значение.(По определению, функция является const, если тип ее указателя this является указателем на const. Только функции-члены могут быть const.)

Чтобы сделать возвращаемый тип const, немедленно поместите constпосле возвращаемого типа, например:

int const foo();

Обратите внимание, однако, что это const игнорируется для типов не из классов;возвращаемое значение будет rvalue (временным), и только rvalues ​​типа класса имеют cv-квалифицированные типы.(Я думаю, что некоторые компиляторы даже предупредят об этом.)

1 голос
/ 28 февраля 2012

Первый означает, что метод не будет изменять какие-либо переменные члена класса (прямо или косвенно).По сути, это означает, что в этом методе нельзя назначить ни одного члена класса, и в теле метода может быть вызван только <method> () const.

Второй означает, что возвращаемое значение не может быть изменено.

1 голос
/ 28 февраля 2012
int foo() const;

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

const int foo();

Это объявляет, что тип возвращаемого значения const; но в этом нет особого смысла.

...