private const 在 C++ class 中是多余的吗?

Is private const redundant in a C++ class?

假设我有一个 class,其中有一个我不想更改的成员变量。假设没有 setter 函数,将该变量设为私有 const 与仅将变量设为私有之间有什么区别吗?

私人:

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

私有常量:

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

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

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

你更正了,如果成员是私有的,任何外人都不能更改它。这并不意味着它无法更改。如果你有另一个成员函数,比如

void bar() { val_ = 42; }

然后你的第一个代码块会编译,而第二个代码块会给你一个错误。如果您真的不想更改成员的值,那么它应该是 const,无论它是否私有。 const 将为您充当错误检查器。

完全取决于 "const" 您希望这个值如何。

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

ConstFoo a{0};
ConstFoo b{2};
a = b;

a 现在有 2 个。

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

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

当然,这使得 ConstFoo 不可分配。

不确定,如果我答对了你的问题,但一般来说:

  • 私有成员只能从 class 内部访问,而 public 成员可以从外部访问
  • 创建此特定对象的新对象时,const 成员只能在构造函数中设置一次 class

这意味着,在创建此 class 的新对象时可以设置一次私有常量变量,因此可以充当内部修饰符(例如,为 [=22] 提供的某些函数提供偏移量=]) 在此对象的整个生命周期内有效。 一个纯粹的私有变量可以从 class 内部更改它的值,因此。

一般来说你是完全正确的,在 C++ 中使用常量的整个概念是为了确保在进一步的开发过程中遵守你的约束(不仅是其他开发人员,也包括你自己)

你自己回答的差不多了:const表达你的意图很清楚,让编译器有能力支持你。

在我看来,const 关键字有两个用途:

A) 它表明程序员的意图是一旦设置此值就不会更改,

B) 它允许编译器强制执行该意图,从而防止错误。

将其命名为 constFoo 在某种程度上实现了其中的第一个,但对第二个没有任何作用。并且(再次恕我直言)比使用 const.

更难看

private 关键字确保 class 之外的任何人都不能修改变量。

如果不修改class里面的变量,结果是一样的。

我认为最好也使用关键字 const,因为它不仅会告诉可能会修改您的 class 的开发人员(包括您自己)它应该保持不变但它也更安全:如果他们尝试修改,修改将不会生效。

所以在我看来这并不是多余的。