C++ :禁止类更改指针成员变量指向的值
C++ : forbid a class to change the value pointed to by a pointer member variable
如果标题听起来很深奥,我深表歉意,让我用一个例子来简化它:
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 ++"有几件事你想知道。
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- C++预处理会生成变量成员、资源库和映射
- 局部堆栈变量成员的返回值优化
- Google Mock:在目标类的构造函数中实例化的模拟私有变量成员
- 使用指向结构变量成员的指针访问该结构的成员的地址
- 如果派生类仅包含自动变量成员,是否有必要具有虚拟驱动器
- 线程安全性和静态变量/成员功能
- "static const char array"可以在 C 语言上包含变量成员吗
- 仅用于内部目的的类的所有变量/成员的技术术语是什么
- 如何强制转换变量成员以将其作为函数的引用参数传递
- 类中未声明变量成员函数
- 在 main 中初始化类的 "static const" 类型变量成员的更好方法
- c++模板类静态const变量成员作为映射键给出未定义引用
- 在类中初始化结构变量成员会导致分割错误
- 在c++中建模变量成员类型
- 模板私有静态变量成员的未定义符号
- 不能访问公共静态变量成员
- 常量变量成员在C++有什么用?
- g++ 4.8.2坚持简单变量成员是数组