[读书笔记]深度探索C++模型_第二章_构造函数语意学

在这一章中,作者要挖掘编译器对于“对象构造过程”的干涉(就是说编译器会对代码做适当的补充),以及对于“程序形式”和“程序效率”上的冲击。

所以这一章,主要是编译器会在什么时候对构造函数干什么的概念上的讲解。

被合成的default constructor只满足编译器的需要,而不是程序的需要。

如果有多个class member object都要求constructor初始化操作,将如何?C++语言要求以“member object在class中声明顺序”来调用各个constructor。

有四种情况,编译器必须为未声明constructor的classes合成一个default constructor
- 调用member object的default constructor
- 调用base class的default constructor
- 为每一个Object其virtual function机制
- 或virtual base class机制

至于没有那4种情况又没有声明任何constructor的classes,我们说它们拥有的是implicit trivial default constructors(隐式无用的默认的构造器),它们实际上并不会被合成出来。

在合成的default constructor中,只有base class subobjects和member class objects会被初始化。其它所有都不会初始化。

从某个object拷贝一份到另一个object身上。不过它并不会拷贝其中的member class object,而是以递归的方式施行memberwise initialization(每个成员的初始化)。

什么时候一个class不展示出”bitwise copy semantics”(逐位拷贝)呢?
- 1、当class内含一个member object而后者的class声明有一个copy constructor时(不论是被class设计者显式地声明,就像前面的String那样;或是被编译器合成,像class Word那样)。
- 2、当class继承自一个base class而后者存在一个copy constructor时(再次强调,无论被显式声明或是被合成而得)。
- 3、当class声明了一个或多个virtual functions时。
- 4、当class派生自一个继承串链,其中有一个或多个virtual base classed时。

上面四种情况其实用一句后概括就是有指针,就不能逐位拷贝。

使用成员初始化列表来初始化成员函数,
Word::Word():_cnt(0),_name(0)
{}
要注意:list中的项目顺序是由class中的members声明顺序决定的,不是由Initialization list中的排列顺序决定的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值