C ++ константные функции-члены модифицируют переменные-члены - PullRequest
12 голосов
/ 12 сентября 2011

Сегодня я узнал, что такой код работает.Это звучит очень странно для меня, потому что, насколько я всегда знал, вы не можете изменить ни одного члена из функции const member.Вы на самом деле не можете сделать это напрямую, но вы можете вызвать неконстантную функцию-член.если вы помечаете функцию-член как const, это означает, что этот указатель, переданный функции, указывает на const-объект, то как неконстантная функция-член вызывается в приведенном ниже примере?

#include <iostream>

class X
{
public:
    void foo() const
    {
        ptr->bar();
    }
    void bar() {}
private:
    X * ptr;
};

int main()
{
}

Ответы [ 3 ]

12 голосов
/ 12 сентября 2011

Ваша переменная-член не X, но указатель на X. Пока foo не изменяет указатель, это может быть const.

4 голосов
/ 12 сентября 2011

Если у вас есть элемент указателя, тогда указатель является const в методе const. Вам не разрешат изменить адрес, сохраненный в указателе. Но вы можете сменить пуантику так, как вам нравится.

Это разница между

X* const cannot_change_pointer;  //this is how top-level const applies to pointers
const X* cannot_change_pointee;

Что еще более интересно, так это то, что const для метода никак не влияет на ссылочные элементы по той же причине (метод const не позволит вам сделать ссылку ссылающейся на что-то еще, что в любом случае невозможно сделать с помощью ссылки) .

0 голосов
/ 12 сентября 2011

Кажется, это нормально. Вызов foo не изменяет член ptr. Следовательно, константа foo соблюдается.

мои 2 цента

...