Възможен дубликат: [Значението на “const” в декларацията на метод на C++?] (https://stackoverflow.com/questions/751681/meaning-of-const-last-in-a-c-method-declaration)
Имам една книга, в която пише нещо подобно:
class Foo
{
public:
int Bar(int random_arg) const
{
// code
}
};
Какво означава това?
"const function", означена с ключовата дума 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 function", което не позволява на функцията да записва в която и да е променлива на класа. За да се позволи на някои от променливите да могат да се записват, дори когато функцията е маркирана като "const function", тези променливи на класа се маркират с ключовата дума mutable
. По този начин, ако променлива на класа е маркирана като променлива и "const function" пише в тази променлива, кодът ще се компилира чисто и променливата може да се променя. (C++11)
Както обикновено при работа с ключовата дума const
, промяната на местоположението на ключовата дума const в изявление на C++ има съвсем различно значение. Горната употреба на const
се прилага само при добавяне на const
в края на декларацията на функцията след скобите.
const
е силно преизползван квалифициращ символ в C++: синтаксисът и подредбата често не са ясни в комбинация с указатели. Някои четива за коректността на const
и ключовата дума const
:
Гарантирано е, че Bar
няма да промени обекта, върху който е извикан. Вижте например раздел за коректността на const в C++ FAQ.
Подобно на този въпрос.
По същество това означава, че методът Bar
няма да модифицира не променливи член-променливи на Foo
.