1.default constructor 的构建,除了以下四种情况,啥都不做
1)带有default constructor的member class object:需要调用member的constructor
2)带有default constructor的base class :需要调用base的constructor
3)带有一个virual function 的class:需要正确初始化vptr
4)带有一个virual base class 的class : 需要正确初始化vbptr
2.copy constructor的构建操作
当用户没有声明copy constructor时,编译器根据class是否表现出bitwise copy semantics 决定是否生成copy constructor;下面四种情况下,class不展现出bitwise copy semantics:
1)当class内含一个member object 而后者的class 声明有一个copy constructor
2)当class的一个base class 有一个copy constructor
3)当class声明了一个或多个virtual functions:需要重新设定vptr
4)当class的派生自一个继承串链,其中有virtual base classes:需要重新设定vbptr
3.program transformation semantics
参数的初始化:void foo(X x0);
X xx;
foo(xx);
会被编译器改写为:
void foo(X &x0);
X _temp0;
_temp0.X::X(xx);
foo(_temp0);
返回值的初始化:X bar(){
X xx;
... //处理xx
return xx;
}
会被编译器改写为:void bar(X &_result){
X xx;
...//处理xx
_result.X::XX(xx);
return ;
}//在调用这个函数的地方做相应改变
Named Return Value(NRV):编译器可能优化的更彻底,copy consturctor都没有调用:
void bar(X &_result){
...//处理_result
return ;
}