前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >C++:39---继承中构造函数、析构函数的关系

C++:39---继承中构造函数、析构函数的关系

作者头像
用户3479834
发布于 2021-02-03 06:50:42
发布于 2021-02-03 06:50:42
1.1K00
代码可运行
举报
文章被收录于专栏:游戏开发司机游戏开发司机
运行总次数:0
代码可运行

一、继承中构造函数的关系

  • 如果父类没有构造函数,则子类初始化时不需要构造父类
  • 如果父类有构造函数,则子类初始化自己的构造函数时,要先初始化父类的构造函数
  • 基类的构造函数必须在派生类的构造函数初始化列表来进行初始化
  • 总结:在构造自己(子类)之前,需要先构造父类

演示案例

  • 例如:下面的父类A有构造函数,则子类B在初始化构造函数时,必须要构造父类A
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class A //父类
{
int a_data;
public:
A(int data) { a_data = data; }
~A() {}//5
};
class B :public A //子类
{
int b_data;
public:
B(int data) :A(10)
{
b_data = data;//3
}
~B() {}//6
};
  • 例如:下面的父类A没有有构造函数,则子类B不需要构造父类
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class A //父类
{
int a_data;
};
class B :public A //子类
{
int b_data;
public:
B(int data)
{
b_data = data;
}
~B() {}
};

二、若一个类中定义了另一类的构造函数关系

与继承中构造父类的构造函数相类似:

  • 如果类中定义的对象没有构造函数,则该类初始化时不需要构造该对象的构造函数
  • 如果类中定义的对象有构造函数,则该类初始化自己的构造函数时,要先初始化该对象的构造函数

总结:在构造自己之前,需要先构造类内的其他对象

注意事项:

  • 类中定义的其它类对象必须在构造函数的初始化列表初始化,不能在构造函数内部初始化

演示案例:

  • 例如:B类中定义了类M的一个对象,且该类有构造函数。则在B的构造函数执行之前需要先初始化m(先执行该类的构造函数)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class M
{
int m_data;
public:
M(int data) { m_data = data; }
~M() {}
};
class B
{
int b_data;
M m;//定义M对象
public:
B(int data):m(20)
{
b_data = data;//3
}
~B() {}//6
};
  • 例如:B类中定义了类M的一个对象,但是M类没有构造函数,所以不需要初始化类M
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class M
{
int m_data;
};
class B
{
int b_data;
M m;
public:
B(int data)
{
b_data = data;
}
~B() {}
};

三、继承中父、子类的构造函数、析构函数的执行顺序

构造函数执行顺序:

  • 第一步:先构造父类的构造函数
  • 第二步:如果类中定义了其他类的对象,再初始化其他类的构造函数
  • 第三步:最后初始化自己的构造函数

析构函数执行顺序: 与构造函数的执行顺序相反

  • 第一步:先执行自己的析构函数
  • 第二步:如果类中定义了其他类的对象,再执行其他类的析构函数
  • 第三步:最后执行父类的析构函数
  • 成员初始化列表初始化顺序不分先后,可随意调整顺序。但子对象必须在成员初始化列表进行初始化

四、单继承中构造函数、析构函数的执行顺序

下面代码中:

  • 构造函数执行顺序为:2-1-3
  • 析构函数执行顺序为:6-4-5
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//单继承
class M
{
int m_data;
public:
M(int data) { m_data = data; }//1
~M(){}//4
};
class A
{
int a_data;
public:
A(int data) { a_data = data; }//2
~A(){}//5
};
class B :public A
{
int b_data;
M m;//定义一个子对象
public:
B(int data) :A(10), m(20)//初始化
{
b_data = data;//3
}
~B(){}//6
};

五、 多继承中构造函数、析构函数的执行顺序

下面代码中:

  • 构造函数执行顺序为:1-2-3
  • 析构函数执行顺序为:6-5-4
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//多继承
class A
{
int a_data;
public:
A(int data) { a_data = data; }//1
~A(){}//4
};
class B
{
int b_data;
public:
B(int data) { b_data = data; }//2
~B(){}//5
};
class C :public A,public B//先继承于A,再继承B
{
int c_data;
public:
C(int data) :A(10),B(20)
{
c_data = data;//3
}
~C(){}//6
};
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-12-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 游戏开发司机 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【C++】继承 ⑦ ( 继承中的对象模型分析 | 继承中的构造函数和析构函数 )
上述 继承 的过程中 , 每一层继承 , 都继承了上一级 父类的 成员变量 , 同时自己也定义了新的成员变量 ;
韩曙亮
2023/10/23
2590
【C++】继承 ⑦ ( 继承中的对象模型分析 | 继承中的构造函数和析构函数 )
【C++】构造函数初始化列表 ④ ( 构造函数 和 析构函数 调用顺序分析 )
析构函数调用顺序 与 构造函数调用顺序相反 , 直接 将 构造函数 调用顺序 倒序排列即可 ;
韩曙亮
2023/10/15
3580
【C++】构造函数初始化列表 ④ ( 构造函数 和 析构函数 调用顺序分析 )
C++新旅程:类的构造函数和析构函数
https://cloud.tencent.com/developer/article/2466159?shareByChannel=link
池央
2024/11/22
570
C++之继承中的构造和析构学习总结
在我们前面学习过类中的构造函数,以及析构函数,那么自然而然,在继承关系中,必然是存在着析构和构造着。
用户6280468
2022/03/21
3660
c++那些事儿3.0 继承
一般形式 class class_name:继承方式 基类名{ code } 继承方式有三种: public ,protected,private. //java好像都是public继承。 单继承 多继承,多继承会很复杂,所以java,c sharp都采用interface。 类函数: 构造函数 先执行父类的构造函数,在执行子类的构造函数。 一般形式 派生类的构造函数(参数列表)
热心的社会主义接班人
2018/04/27
5940
c++那些事儿3.0 继承
c++系列之一构造函数
这里有三个类,其中A,C类是B的父类,然后在Main函数中声明一个B类型的变量,然后程序的输出是这样的:
早起的鸟儿有虫吃
2019/05/05
6890
c++系列之一构造函数
七、构造函数与析构函数
在C++中,构造函数是一种特殊的成员函数,它用于初始化类的对象。当创建类的对象时,构造函数会被自动调用。构造函数的名字与类的名字相同,并且没有返回类型(即使是void也没有)。
用户11332765
2024/10/28
1540
C++: 06---构造函数析构函数
拷贝构造函数: 用一个已经存在的对象来生成一个相同类型的新对象。(浅拷贝) 默认的拷贝构造函数: 如果自定义了拷贝构造函数,编译器就不在生成默认的拷贝构造函数。 如果没有自定义拷贝构造函数,但在代码中用到了拷贝构造函数,编译器会生成默认的拷贝构造函数。 深拷贝&浅拷贝: 系统默认的拷贝构造函数是浅拷贝,类中含有指针类型的变量,须自定义拷贝构造函数用深拷贝来实现。 浅拷贝只是对指针的拷贝,拷贝后两个指针指向同一个内存空间,所指向的空间内容并没有复制,而是由两个对象共用。深拷贝不但对指针进行拷贝,而且对指针指向的内容进行拷贝,经深拷贝后的指针是指向两个不同地址的指针。
用户3479834
2021/02/03
6770
C++: 06---构造函数析构函数
【C++】构造函数初始化列表 ② ( 构造函数 为 初始化列表 传递参数 | 类嵌套情况下 的 构造函数 / 析构函数 执行顺序 )
在下面的代码中 , B 类的 有参构造函数 , 传入了 3 个参数 , 这三个参数都不在函数体中使用 , 而是在 参数列表中使用 ,
韩曙亮
2023/10/15
2900
【C++】构造函数初始化列表 ② ( 构造函数 为 初始化列表 传递参数 | 类嵌套情况下 的 构造函数 / 析构函数 执行顺序 )
探索C/C++的奥秘之C++中的继承
继承的好处是可以复用,通俗点来讲就是父辈打下的江山或者是基业我们可以继续使用。继承是类设计层次的复用。
用户11290648
2025/01/13
1250
探索C/C++的奥秘之C++中的继承
C++学习————第五天(构造函数 析构函数 拷贝构造函数)
关于后面三个默认函数:https://blog.csdn.net/island1314/article/details/137756026?spm=1001.2014.3001.5502
IsLand1314
2024/10/15
1270
C++学习————第五天(构造函数 析构函数 拷贝构造函数)
C++继承
继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,继承允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类、子类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。
用户11316056
2024/10/16
700
C++继承
【深入浅出C#】章节 4: 面向对象编程基础:构造函数和析构函数
构造函数和析构函数是面向对象编程中的两个重要概念,它们在对象的创建和销毁过程中起着关键作用。 构造函数是一个特殊的成员函数,用于在创建对象时初始化对象的数据成员。它的主要作用是为对象分配内存空间并初始化对象的状态。构造函数具有与类同名的特点,并且没有返回类型。通过构造函数,可以确保对象在创建时具有有效的初始状态。构造函数可以被重载,这意味着可以根据需要定义多个具有不同参数的构造函数。 析构函数是一个特殊的成员函数,用于在对象销毁时执行必要的清理操作。它的主要作用是释放对象占用的资源,例如释放动态分配的内存、关闭打开的文件或释放其他外部资源。析构函数的名称与类名相同,前面加上一个波浪线(~)作为前缀。析构函数在对象销毁时自动调用,无法手动调用。 构造函数和析构函数在对象的生命周期中起着关键作用。构造函数确保对象在创建时具有合适的初始化状态,而析构函数则确保对象在销毁时进行必要的清理操作。这种对象创建和销毁的过程对于程序的正确运行和资源管理非常重要。合理使用构造函数和析构函数可以提高代码的可读性、可维护性和可靠性,同时避免内存泄漏和资源泄漏等问题。
喵叔
2023/07/09
7570
构造函数以及析构函数在PHP中需要注意的地方
基本上所有的编程语言在类中都会有构造函数和析构函数的概念。构造函数是在函数实例创建时可以用来做一些初始化的工作,而析构函数则可以在实例销毁前做一些清理工作。相对来说,构造函数我们使用得非常多,而析构函数则一般会用在释放资源上,比如数据库链接、文件读写的句柄等。
硬核项目经理
2020/02/17
1.7K0
当类构造与析构的时候...
2、当类B含有类A的对象,并且使用类B的默认构造函数时,会调用类A的默认构造函数。
看、未来
2021/10/09
6460
当类构造与析构的时候...
【C++】C++构造函数和析构函数
C++提供构造函数来处理对象的初始化。 构造函数是一种特殊的成员函数,不需要用户来调用,定义对象时被自动执行。 构造函数名字与类名相同,无返回类型(void也不能有哦)。
谙忆
2021/01/21
6210
【C++】继承 ⑧ ( 继承 + 组合 模式的类对象 构造函数 和 析构函数 调用规则 )
继承关系 : C 类 继承了 B 类 class C : public B , B 类 继承了 A 类 class B : public A ;
韩曙亮
2023/10/25
2200
【C++】继承 ⑧ ( 继承 + 组合 模式的类对象 构造函数 和 析构函数 调用规则 )
最全面的c++中类的构造函数高级使用方法及禁忌
编译后报错:错误:constructors cannot be declared ‘virtual’,可见构造函数是不能声明为virtual的,这与虚函数的机制有关,虚函数是存放在虚表的,而虚表是在构造函数执行完成以后才建立的,构造函数声明为virtual就会陷入到是先有鸡还是先有蛋的尴尬境地,所以编译器做了限制。
cpp加油站
2021/05/17
1.8K0
C++类的构造函数与析构函数
C++中每个类都有其构造与析构函数,它们负责对象的创建和对象的清理和回收,即使我们不写这两个,编译器也会默认为我们提供这些构造函数。下面仍然是通过反汇编的方式来说明C++中构造和析构函数是如何工作的。
Masimaro
2018/08/31
1.6K0
C++:构造函数与析构函数
构造函数用于对象的初始化,一旦建立对象,就需要有一个有意义的初始值,构造函数的作用即是在对象初始化时被调用,给对象分配内存空间以及完成初始化。
字节星球Henry
2021/08/09
5640
推荐阅读
相关推荐
【C++】继承 ⑦ ( 继承中的对象模型分析 | 继承中的构造函数和析构函数 )
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文