构造函数初始化列表

子类的初始化列表,只能对子类的成员变量进行初始化

class Base{
public:int x;
};class Derived : public Base {
public:Derived() : x(10) {cout << "Derived " << x << endl;};int y;
};int main()
{Base *p = new Derived();
}

上面代码会报下面的错误

In constructor ‘Derived::Derived()’: error: class ‘Derived’ does not have any field named ‘x’
Derived() : x(10) {

初始化列表的作用

初始化列表其实是一种后天强加的初始化语义。

编译器处理后,会把初始化列表的内容先转化,然后插入到构造函数的开头,之后的内容才是你在构造函数里写的语句,如果你有写的话。

但是,这两部分是截然不同的语义:前者是编译器插入的初始化语句,且开始执行用户自己的语句时,编译期要保证所有需要初始化的成员都已经初始化了,这也是各大书籍推荐使用初始化列表显式初始化成员的原因。

继承情况下的初始化顺序

对应一个基类在上的继承树,一个子类对象的初始化顺序是自顶向下。

子类对象的构造函数会首先利用父类的构造函数创建一个父类对象,然后再父类对象的基础之上再把自己创建出来。(想象一个递归调用栈或者后序遍历)

所以,在子类利用构造函数初始化的时候,其父类对象已经是确定构造完毕的

每个对象在其生命周期内只能被初始化一次. 这是一个非常显然的要求

所以,如果我们在子类的初始化列表中对父类成员进行初始化,那么在子类构造函数开始时,这个对象已经可能被父类构造函数初始化了(内建类型需要显式初始化,带有Non-trivial默认构造的函数就算不指定也会被初始化)

析构函数建议写成虚函数

大部分情况下析构函数不写成虚函数都不会有任何影响,但有一种情况例外

有时我们会用父类的指针指向子类,此时析构函数必须声明为虚函数

#include <iostream>
using namespace std;class A
{
public:~A(){cout << "A destructor" << endl;}
};class B : public A
{
public:~B(){cout << "B destructor" << endl;}
};int main()
{A *p = new B;delete p; // bug, 只调用到了基类A的析构函数, 不符合预期return 0;
}

参考文献

  • https://blog.csdn.net/stpeace/article/details/41631353
  • https://blog.csdn.net/uestcyms/article/details/103509443
  • https://blog.csdn.net/bobodem/article/details/49386145?utm_medium=distribute.pc_relevant.none-task-blog-searchFromBaidu-10.control&dist_request_id=&depth_1-utm_source=distribute.pc_relevant.none-task-blog-searchFromBaidu-10.control

类继承中的构造函数与析构函数相关推荐

  1. 7-15 单继承中的构造函数与析构函数 (10 分)

    7-15 单继承中的构造函数与析构函数 (10 分 编写代码实现一个表示点的父类Dot和一个表示圆的子类Cir,求圆的面积. Dot类有两个private数据成员 float x,y; Cir类新增一 ...

  2. C++:继承中的构造函数和析构函数

    C++:继承中的构造函数和析构函数 1.继承中构造函数和析构函数调用顺序 a.调用父类构造函数: b.调用其他成员的构造函数: c.调用子类构造函数: d.析构调用顺序相反. #include < ...

  3. C++类引用中的构造函数与析构函数的执行顺序练习

    引用的类比被引用的类后构造,先析构 #include <iostream> #include <string>using namespace std;class Phone { ...

  4. 单继承中的构造函数与析构函数

    编写代码实现一个表示点的父类Dot和一个表示圆的子类Cir,求圆的面积. Dot类有两个private数据成员 float x,y; Cir类新增一个private的数据成员半径float r 和一个 ...

  5. PTA:单继承中的构造函数与析构函数(c++,继承)

    编写代码实现一个表示点的父类Dot和一个表示圆的子类Cir,求圆的面积. Dot类有两个private数据成员 float x,y; Cir类新增一个private的数据成员半径float r 和一个 ...

  6. C++学习笔记day47-----C++98-继承中的构造函数,析构函数,拷贝构造函数,拷贝赋值函数,多重继承,虚继承

    继承中的构造函数 当通过一个子类创建一个新的对象时,编译器会根据子类在初始化表中指明的基类的初始化方式去调用基类相应的构造函数.如果子类的初始化表中,并没有指明基类的初始化方式,编译器将会调用基类的无 ...

  7. php中的构造函数和析构函数,php 中构造函数和析构函数

    构造函数: 在对象实例化时被调用,一个类中只能有一个构造函数,在类中起初始化的作用. 析构函数: 在对象结束时被自动调用. 话不多说,用一段代码来说明两者的区别: //定义一个类 class Pers ...

  8. C++:51---继承中的构造函数、析构函数、拷贝控制一系列规则

    一.继承中的构造函数 根据构造函数的执行流程我们知道: 派生类定义时,先执行基类的构造函数,再执行派生类的构造函数 拷贝构造函数与上面是相同的原理 二.继承中的析构函数 根据析构函数的执行流程我们知道 ...

  9. C++编程入门系列之十四(类与对象:构造函数和析构函数)

    C++编程入门系列之十四(类与对象:构造函数和析构函数) 鸡啄米上一节中给大家讲解了类的声明.成员的访问控制和对象,今天鸡啄米给大家讲C++编程入门时同样必须掌握的构造函数和析构函数.从上一讲开始已经 ...

最新文章

  1. BZOJ2822 [AHOI2012]树屋阶梯
  2. 架构师论坛 创业_我在早期创业时作为设计师学到的东西
  3. swift 滑动 iphone解锁_这10个iPhone隐藏功能,我就不信你全知道
  4. linux CentOS7 最小化安装环境静默安装Oracle11GR2数据库(安装操作系统环境_01)
  5. elf 取路径_PatchELF 修改linux下elf文件library搜索路径
  6. 2019,最坏的一年,最好的一年,交学费要趁早
  7. day53_电力系统_ztree动态生成权限控制
  8. 计算机一级常用计算公式,2012年计算机一级B考点详解(4)
  9. 【scratch案例教学】scratch中秋佳节 scratch创意编程 少儿编程 边玩边学 小朋友这样贺中秋
  10. Tacotron2 NVIDIA版本优化停顿问题之Biao-Bei数据PhonePrssCrystal
  11. Chrome插件扩展程序的默认安装目录
  12. 友盟推送 php,laravel5.4+umeng(友盟)集成app消息推送功能
  13. web前端工程师做什么
  14. ubuntu及shell脚本常用命令入门
  15. 收银系统可以管理童装店衣服不同的尺码吗?
  16. 在bing中保存自己的搜索关键字.
  17. 每个人都应该知道的 18 个强大的 Excel 快捷键!
  18. java坦克加快速度_Java坦克大战 (六) 之增加可玩性
  19. vue-video-player 实现动态渲染后端传来的视频
  20. 大数据最常用的算法,主要有哪些?

热门文章

  1. 面向对象之数值的悲剧(8月28日会议有感)
  2. Percona XtraBackup备份到恢复记录
  3. hdu 4263(有限制的生成树)
  4. MCSE2003学习之三
  5. BI.寒号鸟请吃烧烤/意外入手“speed- dear friends vol.1”/入手“鲍家街43号”/我爱红红/我爱红红...
  6. Case When 解决简单的是与否
  7. 精确哈克,以贪婪为基础的欺诈式引流法
  8. C语言图书管理系统注册功能,图书管理系统的c语言源程序
  9. PAT甲级排队问题合集 (持续更新中)
  10. 什么样的人适合学习UI?