C++ :禁止类更改指针成员变量指向的值

C++ : forbid a class to change the value pointed to by a pointer member variable

本文关键字:变量 成员 指针 禁止 C++      更新时间:2023-10-16

如果标题听起来很深奥,我深表歉意,让我用一个例子来简化它:

class A
{
public:
    A(int *flag) : flag_(flag) {}
    void foo();
private:
    void bar();
    int *flag_;
};

问题是:我可以阻止这个类更改flag_指向的值吗?

注意:我在想,也许我想写一些类似const int * flag_的东西,但我不想让flag指向的值"不可撤销"地恒定。在我的例子中,这个值是其他类的某个成员变量的值,可以更改。

感谢您的见解!

const int *flag_;不会修改传入的实际变量的恒常性,它只是定义了如何使用flag_。无论你传递到 A 的构造函数中,都不会改变它的恒常性。const 不是运行时更改,它只是防止编码人员意外修改值的语法。你可以让自己做得更好,让它const int *const flag_;这将阻止 A 修改 *flag_ AND flag_ 将无法重新分配。

问题是:我可以阻止这个类更改flag_指向的值吗?

注意:我在想,也许我想写一些类似 const int * flag_ 的东西,但我不想让标志指向的值"不可撤销地"恒定。

所以......你希望它是恒定的...除了你不这样做的时候? 不,我没有看到解决方案。作为类维护者,您可以保持仅在 X 条件下更改flag_不变性。

编辑:我想我误解了你。 只需使指针const(或它指向const的内容)。这对其他成员变量没有任何影响,它只是控制如何使用field_

附带说明一下,存储另一个类的这个成员的地址是否安全? 如果另一个类的实例被移动(存储在任何向量中)会发生什么? 在许多情况下,它可以被移动,使您的指针无效)? 如果为实例分配了自动存储持续时间并且超出范围,会发生什么情况? 如果你真的需要,存储一个指针成员是可以的(你吗?),但有一些事情需要考虑。

不使用const,那么不,你不能。 但是,如果类 A 将标志指针声明为 const ,则应该不会影响另一个具有指向相同内存位置的指针的类修改该值。

int* flag_,是一个私有成员;您类的客户端用户无法更改指向flag_和flag_。

现在这是你的课.不要设计编写任何代码,例如:*flag_=14;

Scott Meyers的"Effective c ++"有几件事你想知道。