const — постоянный член класса, не постоянный

Интересно, когда я передаю значение постоянной переменной, почему эта переменная может измениться.

#include <cstdio>

struct point
{
int x, y, z;
};

class A
{
public:
A(const point &p) :
p(p)
{
printf("(%d,%d,%d)\n", p.x, p.y, p.z);
}

void do_smth()
{
printf("(%d,%d,%d)\n", p.x, p.y, p.z);
}

const point &p;
};

int main(int argc, const char *argv[])
{
point p = {1, 1, 1};
A a(p);
p.y = 4;
a.do_smth();
return 0;
}

стандартный вывод:

(1, 1, 1)
(1, 4, 1)

Я использую g ++ v4.7 без дополнительных аргументов для компиляции этого кода.

1

Решение

Ну, то Point внутри A класс является постоянным, но, как это ссылка в p что это не постоянный, вы можете изменить p сколько угодно и все ссылки на p также изменится Чтобы упростить, ссылки — это всего лишь причудливый указатель.

8

Другие решения

p само по себе не является постоянным. A.p это … Ссылка на неconst переменная с const ссылка волшебным образом не делает это const,

4

const означает, что значение не может измениться через эту ссылку, не то, чтобы это не изменилось вообще.

1

Вы меняете переменную на месте, где она не постоянна. Вы не можете изменить это в do_smth() метод, попробуйте.

Переход к какому-либо классу как константе вообще не меняет объект.

0