1.只有三种情况会调用copy constructor
(1)X xx=x;
(2)参数
(3)返回值
2.bitwise copy semantice
按位直接复制,类似memset
3.一个class不展现出“bitwise copy semantice”的4种情况
(1)class中有个class member并且有一个copy constructor(user code或合成的)。
(2)class继承一个base class且后者有一个copy constructor。
(3)class声明了virtual function。
(4)class派生自virtual base class。
4.如果涉及到virtual(function/class),调用copy constructor就需要重新设定virtual指针(vptr or virtual base class pointer)。例外就是,如果是相同对象,譬如
X a;
X b=a;
这种情况直接bitwise copy就可以了。当然要不存在 3 中的(1)(2)种情况。而且不存在指针,因为指针直接copy,释放时会造成空悬指针问题。
5.constructor最重要的是vptr的调整工作。
class A{
...
}
Class B:public A{
...
}
B b;
A a=b;
发生截断行为,并且a的vptr指向a的vbtl,而不是b的。
6.3种copy方式在编译器的解释
(1)显示初始化
X x1(x0);
----------
//转化成
X x1;//这里不会调用default constructor
x1.X::X(x0);
(2)参数
void foo(X x0)
foo(xx)
----------
X __temp0;
__temp0.X::X(xx);
foo(__temp0)
//并且 foo()的参数需要改成reference
void foo(X &x0);
(3)返回值
X bar(){
X xx;
...
return xx;
}
X xx=bar();
----------
X xx;//不调用构造函数
bar(xx);
//bar大改动:返回值void,参数__result
void bar(X &__result){
X xx;
...
__result.X::X(xx);
return ;
}
7.NRV优化,类似于 6 中对返回值的优化,但是code中直接操作__result,不需要xx。
void bar(X &__result){
__result.X::X();
//直接操作__result
return;
}