热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C++析构和构造函数执行顺序(继承和内嵌成员对象)

结论:C++处理多个对象、以及成员对象和继承时,构造函数的执行顺序与析构顺序相反。也就是先调用构造函数的对象,会后调用析构函数,有点像栈的先入后出。例子1:封闭类和成员对象  1、
结论:C++处理多个对象、以及成员对象和继承时,构造函数的执行顺序与析构顺序相反。也就是先调用构造函数的对象,会后调用析构函数,有点像栈的先入后出。
例子1:封闭类和成员对象

  1、定义:一个类的成员变量是另一个类的对象,则称该成员变量为内嵌成员对象,包含成员对象的类为封闭类。

  2.此时的封闭类和成员对象是 包含(从属)关系,也就是封闭类有(has)成员对象。 例如计算机包含中央处理器和内存等等,计算机类是一个封闭类,cpu类的对象在计算机类里做成员对象。

  3.例如下面的简单案例:

#include
using namespace std;
class MyCpu { //cpu类
public:
MyCpu() { cout << "MyCpu constructor" << endl; }
~MyCpu() { cout << "MyCpu destructor" << endl; }
};
class MyMemory { //内存类
public:
MyMemory(){ cout << "MyMemory constructor" << endl; }
~MyMemory() { cout << "MyMemory destructor" << endl; }
};
class MyComputer { //计算机类:封闭类
public:
MyComputer() {
cout << "MyComputer constructor" << endl;
}
~MyComputer() { cout << "MyComputer destructor" << endl; }
private:
MyCpu cpu_; //内嵌成员对象
MyMemory mem_;
};
void test01() {
MyComputer myCom;
}
int main() {
test01();
return 0;
}

  4.分析:首先会调用成员对象的构造函数,再调用封闭类的构造函数;析构时先调用封闭类的析构函数,再调用成员对象的析构函数。《C++析构和构造函数执行顺序(继承和内嵌成员对象)》

例子2:继承时基类与派生类
  1.继承时,基类与派生类的关系为:具体类是一个抽象类的关系,即A是(is)一个B。例如抽象类是人类,具体类是学生类,某个学生是一个人。

  2.简单例子:

#include
using namespace std;
//C++处理顺序一般规律:先构造的后析构,类似于栈。
//先调用基类的构造,先调用派生类的析构
class MyBase { //基类
public:
MyBase(int b=0) :b_(b) {
cout << "MyBase constructor" << endl;
}
~MyBase(){ cout << "MyBase destructor" << endl; }
private:
int b_;
};
class MyDerive: public MyBase{ //派生类
public:
MyDerive(int b=0, int d=0)
:MyBase(b), d_(d)
{
cout << "MyDerive constructor" << endl;
}
~MyDerive() { cout << "MyDerive destructor" << endl; }
private:
int d_;
};
int main() {
MyDerive der;
return 0;
}

  3.分析:首先会基类的构造函数,再调用派生类的构造函数;析构时先调用派生类的析构函数,再调用基类的析构函数。
《C++析构和构造函数执行顺序(继承和内嵌成员对象)》
  细节补充:采用初始化列表来解决基类成员和内嵌成员对象的初始化。因为子类不会继承父类的构造器和析构器,所以子类新增自己的非成员对象的普通变量在子类的构造函数里初始化,父类成员变量的初始化需要父类的构造函数进行初始化。

派生类构造函数名(总形参列表)
:基类构造函数名(基类构造函数实参表),内嵌成员对象名(成员对象的构造函数实参)
{
派生类普通变量初始化;//不嫌长的话,也可以放到初始化列表
}

推荐阅读
  • 题目概述:Sereja 拥有一个由 n 个整数组成的数组 a1, a2, ..., an。他计划执行 m 项操作,这些操作包括更新数组中的特定元素、增加数组中所有元素的值,以及查询数组中的特定元素。 ... [详细]
  • 题目描述:Balala Power! 时间限制:4000/2000 MS (Java/Other) 内存限制:131072/131072 K (Java/Other)。题目背景及问题描述详见正文。 ... [详细]
  • 本文针对HDU 1042 N! 问题提供详细的解析和代码实现。题目要求计算给定整数N(0 ≤ N ≤ 10000)的阶乘N!。文章不仅提供了算法思路,还附上了C++语言的具体实现。 ... [详细]
  • 本文探讨了Linux环境下线程私有数据(Thread-Specific Data, TSD)的概念及其重要性,介绍了如何通过TSD技术避免多线程间全局变量冲突的问题,并提供了具体的实现方法和示例代码。 ... [详细]
  • 探讨了一个包含纯虚函数的C++代码片段,分析了其中的语法错误及逻辑问题,并提出了修正方案。 ... [详细]
  • 本文介绍了一个来自AIZU ONLINE JUDGE平台的问题,即清洁机器人2.0。该问题来源于某次编程竞赛,涉及复杂的算法逻辑与实现技巧。 ... [详细]
  • 本文介绍了使用Python和C语言编写程序来计算一个给定数值的平方根的方法。通过迭代算法,我们能够精确地得到所需的结果。 ... [详细]
  • 该问题描述了以不同价格购买三种类型的鸡(公鸡、母鸡和小鸡),使用100元恰好购买100只鸡的不同组合。具体而言,每只公鸡价值5元,每只母鸡价值3元,而每三只小鸡价值1元。问题是,如何用100元购买100只鸡,并找出所有可能的公鸡、母鸡和小鸡的组合。 ... [详细]
  • 本文提供了一个关于AC自动机(Aho-Corasick Algorithm)的详细解析与实现方法,特别针对P3796题目进行了深入探讨。文章不仅涵盖了AC自动机的基本概念,还重点讲解了如何通过构建失败指针(fail pointer)来提高字符串匹配效率。 ... [详细]
  • SSE图像算法优化系列三:超高速导向滤波实现过程纪要(欢迎挑战)
    自从何凯明提出导向滤波后,因为其算法的简单性和有效性,该算法得到了广泛的应用,以至于新版的matlab都将其作为标准自带的函数之一了&#x ... [详细]
  • 编程解析:CF989C 花朵之雾 (构造算法)
    本文深入探讨了CF989C '花朵之雾'问题的构造算法,提供了详细的解题思路和代码实现。 ... [详细]
  • 本文详细探讨了HihoCoder平台上的1398号问题——最大权闭合子图的求解方法。通过具体实例,深入分析了最大权闭合子图的概念及其算法实现。 ... [详细]
  • Hanks博士是一位著名的生物技术专家,他的儿子Hankson对数学有着浓厚的兴趣。最近,Hankson遇到了一个有趣的数学问题,涉及求解特定条件下的正整数x,而不使用传统的辗转相除法。 ... [详细]
  • OpenCV中的霍夫圆检测技术解析
    本文详细介绍了如何使用OpenCV库中的HoughCircles函数实现霍夫圆检测,并提供了具体的代码示例及参数解释。 ... [详细]
  • STM32代码编写STM32端不需要写关于连接MQTT服务器的代码,连接的工作交给ESP8266来做,STM32只需要通过串口接收和发送数据,间接的与服务器交互。串口三配置串口一已 ... [详细]
author-avatar
Ace狂_338
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有