在我的测试中,创建后仍然可以修改对象。
//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?
没有初始化列表,因此在创建之后
答案 0 :(得分:2)
f2
不在创建后被修改。这一行
const Foo f2(f1);
创建f2
,f2
可以修改构造函数体中自己的数据成员。退出构造函数的主体后,该对象将完全构造,无法修改。
有几点值得一提:
var
为const
,则必须在构造函数的初始化列表中对其进行初始化,并且无法在构造函数的主体中对其进行修改。这与您是否拥有const
Foo
实例无关。var
被声明为mutable
,则可以通过修改const Foo
的{{1}}方法修改const
个实例。答案 1 :(得分:1)
对象的生命周期直到它的构造函数完成才开始(C ++ 03 3.8“对象生命周期”),所以在此之前没有任何东西是const
。特别是,C ++ 03 12.1 / 4“构造函数”说:
const
和volatile
语义(7.1.5.1)未应用于 正在建设的对象。这种语义只会生效一次 最派生对象(1.8)的构造函数结束。