Ответ 1
"Функция 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; f.Bar(4)
будет внутренне соответствовать чему-то вроде Foo f; Foo_Bar(&f, 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 function", запрещающее функции писать любую переменную класса. Чтобы позволить некоторым переменным быть доступными для записи, даже если функция помечена как "константная функция", эти переменные класса помечаются ключевым словом mutable
. Таким образом, если переменная класса помечена как изменяемая, и "константная функция" записывает в эту переменную, тогда код будет скомпилирован правильно, и переменную можно будет изменить. (C++ 11)
Как обычно при работе с ключевым словом const
, изменение местоположения ключевого слова const в выражении C++ имеет совершенно разные значения. Вышеупомянутое использование const
применяется только при добавлении const
в конец объявления функции после круглых скобок.
const
- это преувеличенный префикс в C++: синтаксис и порядок часто не так просты в сочетании с указателями. Некоторые показания о const
корректности и const
ключевое слово: