Подтвердить что ты не робот

Функции-члены С++ const изменяют переменные-члены

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

#include <iostream>

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

int main()
{
}
4b9b3361

Ответ 1

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

Ответ 2

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

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

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

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

Ответ 3

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

мои 2 цента