Если вы хотите, чтобы компилятор это применил, объявите функцию-член const
:
bool contains(string word) const
{
...
}
Функция const
не может изменять свои переменные-члены и может вызывать только другие const
функции-члены (либо свои, либо функции своих переменных-членов).
Исключением из этого правила является то, что переменная-член объявлена как mutable
. [Но mutable
не следует использовать как обходной путь const
общего назначения;Он действительно предназначен только для ситуаций, когда «наблюдаемое» состояние объекта должно быть const
, но внутренняя реализация (например, подсчет ссылок или отложенная оценка) все еще нуждается в изменении.]
Также обратите внимание, что const
не распространяется, например, через указатели.
Итак, в итоге:
class Thingy
{
public:
void apple() const;
void banana();
};
class Blah
{
private:
Thingy t;
int *p;
mutable int a;
public:
Blah() { p = new int; *p = 5; }
~Blah() { delete p; }
void bar() const {}
void baz() {}
void foo() const
{
p = new int; // INVALID: p is const in this context
*p = 10; // VALID: *p isn't const
baz(); // INVALID: baz() is not declared const
bar(); // VALID: bar() is declared const
t.banana(); // INVALID: Thingy::banana() is not declared const
t.apple(); // VALID: Thingy::apple() is declared const
a = 42; // VALID: a is declared mutable
}
};