假设我有一个包含我不想更改的成员变量的类。假设没有 setter 函数,将该变量设为私有(private)常量和仅将变量设为私有(private)有什么区别吗?

私有(private)的:

class ConstFoo
{
public:
    Foo(int a);
    virtual ~Foo();
    int val(){ return val_; }
private:
    int val_;
}

私有(private)常量:
class ConstFoo
{
public:
    Foo(int a);
    virtual ~Foo();
    int val(){ return val_; }
private:
    const int val_;
}

两者之间似乎没有区别,因为在任何一种情况下都无法更改 val_ 的值,因此 const 限定符似乎是多余的。

我可以看到明确添加 const 的一个原因是为了代码清晰,因此将来处理代码的人不会向函数添加 setter。但是,名称为 ConstFoo 并且文档特别说明它不是可变的,我认为这不会成为问题。

最佳答案

这完全取决于您希望此值如何“const”。

就目前而言,没有外部用户可以直接更改该值。但是他们可以间接这样做,因为对象本身可能不是 const :

ConstFoo a{0};
ConstFoo b{2};
a = b;
a 现在有 2 个。

另外,ConstFoo 中的代码也可以改变它的值;这就是复制赋值运算符可以更改其值的原因。

因此,如果您想确保特定成员对象在任何 ConstFoo 实例的整个生命周期中都采用一个值,则将其声明为 const

当然,这使得 ConstFoo 不可赋值。

关于c++ - C++ 类中的私有(private)常量是多余的吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50299632/

10-16 16:21