c++内存模型二

有四种情况,会导致编译器必须为未声明constructor之classes合成一个default counstructor。

1)包含成员对象

2)base class的默认counstructor

3)为每一个对象初始化其virtual function机制

4)为每一个对象初始化其virtual base class机制

除却这四种情况,default counstructor 实际上并没有被合成出来。


两个常见的误解:

1)任何class如果没定义default counstructor,就会合成一个。、

2)编译器合成出来的default counstructor会明确设定class内每一个data member 的默认值。

没有一个是真的。


三种情况下Copy Counstructor的建构

1)

X x; 

X xx = x;

2)void F(X x);

3)X F();

什么时候需要编译器合成Copy Counstructor

1)class 内含一个member object而后者的class声明有一个copy counstructor时。

2)class继承自一个base class 而后者存在一个copy counstructor时。

3)当class声明有virtual function时。

4)当class继承串链中有virtual base class时。


关于vptr:

Bear yo;

Bear win = yo;

yo的vptr被设定指向Bear Class的virtual table,因此yo的vptr值拷贝给win的vptr是安全的。

当 ZooAnimal zo = yo; // 发生切割行为

zo的vptr不可以被设定指向Bear Class 的 virtual table



Copy Counstructor样式:

1)X x1 = x0;

2)X x2(x0);

3)X x3 = X(x0);


使用第二种提高效率:

X fun()
{

X x;

return x;
}

X fun()
{

return X();
}


这回改变内部的vptr,构造函数被扩张时,vptr在memset之前赋值。

class Shape
{
    Shape()
    {
         memset(this,0,sizeof(Shape));
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MyObject-C

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值