【发布时间】:2021-08-05 01:46:36
【问题描述】:
指向 const 对象的指针不允许更改对象。例如:
class foo {
public:
int m_data;
foo() : m_data{11} {}
};
void change(const foo *obj)
{
obj -> m_data = 21; // gives error, normal
}
这是正常的行为。
我不明白的是,当我们添加一个额外的指针变量时,无论是相同类型(如foo *)还是其他类型(如bar *),但不是像@987654326这样的基本类型@,那么我们可以改变指针指向的值(从指针指向 const 类型本身)。
这怎么可能?
class foo {
public:
int m_data;
foo *m_next;
foo() : m_data{11}, m_next{nullptr} {}
};
void change(const foo *obj)
{
obj -> m_next -> m_data = 21; // does not give any error! why?
}
如果我们在 foo 中使用其他类型,也会发生这种情况,例如 bar *。
为什么会这样?如何定义函数以确保我的函数不能更改对象指向的值?
【问题讨论】:
-
您没有更改
m_next或*obj中的任何其他内容。foo是const意味着您不能,例如,重新分配m_next以指向其他东西。有关区别的更多信息,请参阅here 或类似问题。 -
constness 不可传递 -
关于如何制作 deep-const 指针:How to make a deep-const pointer