常量对象的常量是什么?

时间:2012-09-23 10:04:28

标签: c++ object constants

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

//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?

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

2 个答案:

答案 0 :(得分:2)

f2 在创建后被修改。这一行

const Foo f2(f1); 

创建f2f2可以修改构造函数体中自己的数据成员。退出构造函数的主体后,该对象将完全构造,无法修改。

有几点值得一提:

  • 如果varconst,则必须在构造函数的初始化列表中对其进行初始化,并且无法在构造函数的主体中对其进行修改。这与您是否拥有const Foo实例无关。
  • 如果var被声明为mutable,则可以通过修改const Foo的{​​{1}}方法修改const个实例。

答案 1 :(得分:1)

对象的生命周期直到它的构造函数完成才开始(C ++ 03 3.8“对象生命周期”),所以在此之前没有任何东西是const。特别是,C ++ 03 12.1 / 4“构造函数”说:

  

constvolatile语义(7.1.5.1)未应用于   正在建设的对象。这种语义只会生效一次   最派生对象(1.8)的构造函数结束。