《深度探索C++对象模型》:copy constructor

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值