«Функция const», обозначенная ключевым словом const
после объявления функции, делает ошибку компилятора для этой функции класса для изменения переменной-члена класса. Тем не менее, чтение переменных класса нормально внутри функции, но запись внутри этой функции приведет к сбою компилятора.
Другой способ мышления о такой «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)
. Теперь добавление константы в конец (int Foo::Bar(int random_arg) const
) можно затем понимать как объявление с константой этого указателя: int Foo_Bar(const Foo* this, int random_arg)
. Так как тип this
в этом случае является const, модификации переменных-членов не возможны.
Можно отменить ограничение «const function», не позволяющее функции писать любой переменной класса. Чтобы позволить некоторым из переменных записываться, даже если функция помечена как «функция const», эти переменные класса помечены ключевым словом mutable
. Таким образом, если переменная класса помечена как изменяемая, а «const function» записывает в эту переменную, тогда код будет компилироваться чисто, и переменную можно изменить. (C++ 11)
Как обычно, имея дело с ключевым словом const
, изменение местоположения ключевого слова const в операторе C++ имеет совершенно разные значения. Вышеуказанное использование const
применяется только при добавлении const
в конец объявления функции после скобок. const
- сильно переоцененный квалификатор в C++, а синтаксис и упорядочение часто не являются однозначными в сочетании с указателями. Некоторые показания о const
правильности и const
ключевое слово:
Const correctness
The C++ 'const' Declaration: Why & How
Дубликат http://stackoverflow.com/questions/751681/meaning-of-const-last-in-ac-method-declaration –
Он изменяет тип 'this' из' Foo * const' в 'const Foo * const'. Это имеет последствия. – sbi
Я не понимаю ваши изменения. Что именно вы хотите знать? Если объявление двух переменных типа Foo создаст несколько экземпляров функций Bar? –