class Foo {
public:
int a = 1;
};
class Bar {
public:
Foo *foo_ptr = new Foo;
};
int main() {
const Bar bar;
bar.foo_ptr.a++; // valid: a == 2
bar.foo_ptr = nullptr; // invalid: foo_ptr is const
}
我明白,为什么上面的代码是正确的 - 对象 bar
是常量,所以 foo_ptr
是指向非常量 Foo
对象的常量指针.但我认为这有点不合逻辑。为什么 Foo
对象也没有变成 const?
如果我希望 Bar
对象在此处成为绝对 const
,并且 foo_ptr
成为指向 a 的常量指针,我该怎么办常量对象?
例如,我将 Bar
对象发送给某个方法,但我不希望它或其中的任何 Foo
对象是可修改的。
最佳答案
But I think it's a bit illogical. Why
Foo
object also did not becomeconst
?
编译器无法假设将 const
的概念扩展到什么程度。作为 Bar
的设计者,您必须在这方面帮助编译器。为此,您可以将成员变量设置为 private
并提供 public
接口(interface)来保留指针指向的对象的 const
特性。
将您的类(class)更新为:
class Bar {
public:
Foo* getFoo();
Foo const* getFoo() const;
private:
Foo *foo_ptr = new Foo;
};
现在
int main() {
const Bar bar1;
bar1.getFoo()->a++; // Not OK. Compiler error.
Bar bar2;
bar2.getFoo()->a++; // OK.
}
关于c++ - 如何通过const对象中的指针使对象成为常量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51525316/