1

根据我的测试,对象在创建后仍然可以修改。

//Let's use this copy constructor as an example:
Foo::Foo( const Foo& F )
{
  var = F.var;
}

//With this code:
Foo f1;
const Foo f2(f1); //No Error?

没有初始化列表,因此 f2在创建正在修改。因此,如果 Foo 的成员仍然是可修改的,那么保持不变的是什么?

4

2 回答 2

2

f2创建后不修改。这条线

const Foo f2(f1); 

创建f2,并且f2可以在构造函数的主体中修改它自己的数据成员。一旦构造函数的主体退出,对象就被完全构造并且不能被修改。

有几点值得一提:

  • 如果varconst,则必须在构造函数的初始化列表中对其进行初始化,并且不能在构造函数的主体中对其进行修改。这与您是否有const Foo实例无关。
  • 如果var已声明mutable,则可以const Foo通过const修改var.
于 2012-09-23T10:07:12.347 回答
1

对象的生命周期在其构造函数完成之前不会开始(C++03 3.8“对象生命周期”),因此在此之前没有什么是const. 特别是,C++03 12.1/4 "Constructors" 说:

constvolatile语义(7.1.5.1)不适用于正在构建的对象。此类语义仅在最派生对象 (1.8) 的构造函数结束后才生效。

于 2012-09-23T10:12:22.067 回答