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