如果标题听起来深奥,我道歉,让我用一个例子来说明这一点:
class A
{
public:
A(int *flag) : flag_(flag) {}
void foo();
private:
void bar();
int *flag_;
};
问题是:我可以阻止此类更改flag _?
指向的值注意:我在想,也许我想写一些像const int * flag_
这样的东西,但我不想让flag
指出的值“不可撤销地”不变。在我的例子中,这个值是某个其他类的某个成员变量的值,可以更改。
感谢您的见解!
答案 0 :(得分:3)
const int *flag_;
不会修改传入的实际变量的常量,它只定义了如何使用flag_。无论你传入A的构造函数,都不会改变它的常量。 const不是运行时更改,它只是防止编码器意外修改值的语法。你可以做得更好,并使它const int *const flag_;
,这将阻止A修改* flag_ AND flag_将不会被重新分配。
答案 1 :(得分:1)
问题是:我可以阻止此类更改flag _?
指向的值注意:我在想,也许我想写一些像const int * flag_这样的东西,但是我不想让flag指向的值“不可撤销地”不变。
所以......你想让它保持不变......除非你不这样做?不,我没有看到解决方案。作为类维护者,您可以维护flag_
仅在X条件下更改的不变量。
const
(或它指向const
)。这对其他成员变量没有任何影响,它只是控制field_
的使用方式。
另一方面,存储另一个班级成员的地址是否安全?如果移动了另一个类的实例(存储在任何向量中,会发生什么?在很多情况下可以移动它,使指针无效)会发生什么?如果实例分配了自动存储持续时间并超出范围会发生什么?如果真的需要(是吗?),可以存储指针成员,但是有些事情你需要考虑。
答案 2 :(得分:0)
不使用const
然后你不能。但是如果类A将标志指针声明为const
,那么它应该不会影响另一个具有指向同一内存位置的指针的类来修改该值。
答案 3 :(得分:0)
int * flag_是私有成员; 您班级的客户用户无法更改flag_和flag_指向。
现在这是你的班级。 不要设计编写任何代码,例如:* flag_ = 14;
Scott Meyers"有效的c ++"有一些你想知道的事情。