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