Ale*_*J93 3 c++ const private class
假设我有一个带有成员变量的类,我不想更改它.假设没有setter函数,那么使该变量成为私有const和仅将变量设为私有之间有什么区别吗?
私人的:
class ConstFoo
{
public:
Foo(int a);
virtual ~Foo();
int val(){ return val_; }
private:
int val_;
}
Run Code Online (Sandbox Code Playgroud)
私人Const:
class ConstFoo
{
public:
Foo(int a);
virtual ~Foo();
int val(){ return val_; }
private:
const int val_;
}
Run Code Online (Sandbox Code Playgroud)
似乎两者之间没有区别,因为val_在任何一种情况下都无法改变值,因此const限定符似乎是多余的.
我可以看到明确添加的一个原因const是代码清晰度,因此将来处理代码的人不会在函数中添加setter.但是,由于名称ConstFoo和文档明确指出它不是可变的,我认为这不会是一个问题.
Nic*_*las 12
这都是你想要这个值的"常量"的问题.
目前看来,没有外部用户可以直接更改该值.但他们可以间接地这样做,因为对象本身可能不是const:
ConstFoo a{0};
ConstFoo b{2};
a = b;
Run Code Online (Sandbox Code Playgroud)
a 现在有2个.
另外,内部 代码ConstFoo也可以改变其价值; 这就是复制赋值运算符可以更改其值的原因.
因此,如果要确保特定成员对象在任何ConstFoo实例的整个生命周期中都采用一个值,则声明它const.
当然,这使得ConstFoo不可转让.
您更正了,如果该成员是私有的,则不会更改该成员.这并不意味着它无法改变.如果你有另一个成员函数
void bar() { val_ = 42; }
Run Code Online (Sandbox Code Playgroud)
然后你的第一个代码块将编译,而第二个代码块会给你一个错误.如果您真的不希望能够更改成员的值,那么const无论它是否为私有,都应该是.这const将作为你的bug检查器.