c++ - 如何通过const对象中的指针使对象成为常量?

标签 c++ pointers constants transitive-const

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 become const?

编译器无法假设将 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/

相关文章:

c++ - 如何在没有-g的情况下获取元数据

c++ - 用于 12 位灰度 JPEG 压缩的霍夫曼表

c - 如何访问 C 结构体中的指针成员?

c - 如何打印字符**

Objective-C/C 常量标量值声明

c++ - 返回引用的 const 方法

c++ - 为什么我不能 push_back 到 const 元素的 vector ?

c++ - boost spirit 语义 Action

c++ - 使用静态局部变量获取绑定(bind)/推断捕获 lambda 的函数指针

c - 在c中分配大型指针数组(9mb)