私有const在C++类中是多余的吗?

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不可转让.

  • @ AlexanderJ93:除非你写一个.即使这样,书面的也不能改变`const`成员.只需要"封装"(外人不能触摸它)和"const"(*nobody*可以触摸它)之间存在区别. (2认同)

Nat*_*ica 7

您更正了,如果该成员是私有的,则不会更改该成员.这并不意味着它无法改变.如果你有另一个成员函数

void bar() { val_ = 42; }
Run Code Online (Sandbox Code Playgroud)

然后你的第一个代码块将编译,而第二个代码块会给你一个错误.如果您真的不希望能够更改成员的值,那么const无论它是否为私有,都应该是.这const将作为你的bug检查器.