C++对象模型-构造函数语义学 第二章笔记

读完C++对象模型书后,做一个笔记整理
第一章-关于对象
第二章-构造函数语义学
第三章-Data语义学
第四章-Function语义学
第五章-构造拷贝解析语义学
第六章-执行期语义学
第七章-在对象模型的尖端

C++默认构造函数会在需要的时候被产生出来,且只在编译器需要的时候才合成。且合成出来只执行编译器需要的行动。即使合成了默认构造函数,也不会将成员变量初始化为0,若要如此需要程序员提供明显的默认构造函数。

编译器默认构造函数在如下4种情况会合成出来(nontrival default constructor)

  1. 成员函数带有默认构造函数,则此class的implicit default constructor就是nontrivial。
  • 在构造函数真正需要调用时才会合成默认构造函数。
  • 且被合成的默认构造函数仅满足编译器需要,而非程序需要。
  • 合成构造函数或扩张已存在的构造函数,会以在class中的声明次序调用每一个成员object的构造函数
  1. 带有默认构造的基类
  • 子类的默认构造将会调用父类构造
  • 若子类程序员给出其它构造,但无默认构造,则编译器会扩张现有构造,将用以调用所有必要之默认构造代码加入。
  1. 带有一个vritual funcion的类
  • 若class 声明或继承一个virtual function 或 派生自继承串链,其中有1个或更多个虚基类,则也需合成默认构造
  • 每个类会一个虚函数表, 存放类的虚函数地址,每个对象生成时都会有一个指针指向虚函数表
  1. 带有一个virtual base class的类
  • 每种虚基类的实现均不同,但必须在执行期准备妥当虚基类在子类中的位置。

可以看出默认构造函数是用满足,要调用涉及到的构造函数,及虚函数,虚继承的。

至于不在以上4种情况中且又没声明任何构造的,他们拥有implicit trival default constructors 隐含无用默认构造函数。

如果类体现出位拷贝语义,则其拷贝构造函数是不必要的。有4 种情况不是位拷贝语义

  1. 类内包含一个拥有拷贝构造函数的的成员
  2. 类继承自一个有拷贝构造函数的基类
  3. 类中含有虚函数
  4. 类有一个或多个虚基类
  • 拷贝构造需要正确设置vptr,如在父类 a=子类 b;这种情况时。
  • 虚基类同样需要正确设置其位置。若父类有虚基类virtual base,父类 a=子类 b;编译器必须保证赋值后通过a也能正确访问虚基类。

构造函数中成员初始化列表先与任何用户代码执行,成员的初始化有4种情况必须使用成员初始化列表

  1. 初始化一个引用成员
  2. 初始化一个const 成员
  3. 调用一个基类的有一组参数的构造函数
  4. 调用一个成员的有一组参数的构造函数
  • 成员初始化列表的顺序以class中的声明顺序决定,而非成员初始化列表中书写顺序
  • 而在成员初始化列表中调用成员函数来为变量初始化,是可以的,但若子类成员函数的结果当成父类构造的参数,则会未知结果,因为在子类成员初始化列表执行时,先调用父类构造,再初始化子类,故子类成员函数返回结果,可能是未知的。

下一篇 第三章-Data语义学

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

nwao7890

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

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

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

打赏作者

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

抵扣说明:

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

余额充值