Что означает "const" в конце объявления функции?
Возможный дубликат:
Значение "const" последний в объявлении метода C++?
Я получил книгу, где там написано что-то вроде:
class Foo
{
public:
int Bar(int random_arg) const
{
// code
}
};
Что это значит?
6 ответов
"Const function", обозначаемая ключевым словом const
после объявления функции делает это ошибкой компилятора для этой функции класса, чтобы изменить переменную-член класса. Тем не менее, чтение переменных класса хорошо внутри функции, но запись внутри этой функции вызовет ошибку компилятора.
Другой способ думать о такой "константной функции" - рассматривать функцию класса как нормальную функцию, принимающую неявную this
указатель. Так что метод int Foo::Bar(int random_arg)
(без константы в конце) приводит к такой функции, как int Foo_Bar(Foo* this, int random_arg)
и вызов, такой как Foo f; f.Bar(4)
будет внутренне соответствовать чему-то вроде Foo f; Foo_Bar(&f, 4)
, Теперь добавляем const в конце (int Foo::Bar(int random_arg) const
) тогда можно понимать как объявление с константой этого указателя: int Foo_Bar(const Foo* this, int random_arg)
, Так как тип this
в таком случае const, никакие модификации переменных-членов невозможны.
Можно ослабить ограничение "const function", запрещающее функции писать любую переменную класса. Чтобы позволить некоторым переменным быть доступными для записи, даже если функция помечена как "константная функция", эти переменные класса помечаются ключевым словом mutable
, Таким образом, если переменная класса помечена как изменяемая, и "константная функция" записывает в эту переменную, тогда код будет скомпилирован корректно, и переменную можно изменить. (C++11)
Как обычно, когда имеешь дело с const
Ключевое слово, изменяющее местоположение ключевого слова const в выражении C++, имеет совершенно разные значения. Вышеуказанное использование const
применяется только при добавлении const
до конца объявления функции после круглых скобок.
const
в C++ - преувеличенный квалификатор: синтаксис и порядок часто не так просты в сочетании с указателями. Некоторые чтения о const
правильность и const
ключевое слово:
Рассмотрим две переменные класса:
class Boo { ... };
Boo b0; // mutable object
const Boo b1; // non-mutable object
Теперь вы можете вызывать любую функцию-член Boo
на b0
, но только const
функции-члены на b1
,
Bar
гарантированно не изменяет объект, на который он вызывается. См. Раздел о правильности констант в C++ FAQ, например.
Похоже на этот вопрос.
По сути это означает, что метод Bar
не будет изменять не изменяемые переменные-члены Foo
,
Я всегда нахожу концептуально легче думать о том, что вы делаете указатель константным (что во многом и делает).
Функция не может изменить свои параметры через указатель / ссылку, которую вы ей дали.
Я захожу на эту страницу каждый раз, когда мне нужно подумать об этом:
http://www.parashift.com/c++-faq-lite/const-correctness.html
Я считаю, что есть хорошая глава в "Более эффективном C++" Мейерса.