假设我有一个包含我不想改变的成员变量的类。假设没有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
,并且文档明确指出它不是可变的,我认为这不会是一个问题。
答案 0 :(得分:12)
这完全取决于" const"你想要这个值。
目前看来,没有外部用户可以直接更改值。但他们可以间接地这样做,因为对象本身可能不是const
:
ConstFoo a{0};
ConstFoo b{2};
a = b;
a
现在有2个。
另外, ConstFoo
中的代码也可以更改其值;这就是复制赋值运算符可以更改其值的原因。
因此,如果您希望确保特定成员对象在任何ConstFoo
实例的整个生命周期中都采用一个值,则声明它为const
。
当然,这会使ConstFoo
不可分配。
答案 1 :(得分:7)
您更正了如果成员是私人的,则不会有外人改变该成员。这并不意味着它无法改变。如果您有其他成员函数,如
void bar() { val_ = 42; }
然后你的第一个代码块会编译,而第二个代码块会给你一个错误。如果您确实不希望能够更改成员的值,那么它应该是const
,无论它是否为私有。 const
将为您充当错误检查程序。
答案 2 :(得分:1)
不确定,如果我的问题是正确的,但一般来说:
这意味着,私有const变量可以在创建此类的新对象时设置一次,并且可以作为内部修饰符(例如,为该类提供的某些函数提供偏移量)在整个生命周期内有效宾语。 一个纯粹的私有变量可以从类内部改变它的价值。
一般来说,你完全正确,在C ++中使用常量的整个概念是为了确保你的约束在进一步的开发过程中得到遵守(不仅是其他开发人员,也是你自己)
答案 3 :(得分:1)
你自己已经做了很多回答:让它const
非常清楚地表达你的意图,让编译器能够支持你。
我认为,const
关键字有两个目的:
A)它表明程序员意图一旦设置了这个值就不会改变,
B)它允许编译器强制执行该意图,从而防止错误。
命名它constFoo
在某种程度上实现了第一个,但对第二个没有任何作用。并且(再次恕我直言)比使用const
明显更难看。
答案 4 :(得分:1)
private
关键字可确保班级外无人可以修改变量。
如果你不修改类中的变量,那么结果是相同的。
我认为最好使用关键字const
,因为它不仅告诉开发人员(包括你自己),他们可能会修改你的课程,使其保持不变,但也更安全:如果他们尝试修改修改就没有效果。
所以在我看来这并不多余。