博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++:派生类的构造函数和析构函数
阅读量:6397 次
发布时间:2019-06-23

本文共 3778 字,大约阅读时间需要 12 分钟。

                        4.2 派生类的构造函数和析构函数

4.2.1 派生类构造函数和析构函数的执行顺序
通常情况下,当创建派生类对象时,首先执行基类的构造函数,随后再执行派生类的构造函数;
当撤销派生类对象时,则先执行派生类的派生类的析构函数,随后再执行基类的析构函数。 
//例4.5 派生类的构造函数和析构函的执行顺序

#include
using namespace std;class Base{ //声明基类Base public: Base() { cout<<"Constructor Base Class.."<

4.2.2 派生类构造函数和析构函数的构造规则

1. 简单的派生类的构造函数

当基类的构造函数没有参数,或没有显式定义构造函数时,派生类可以不向基类传递参数,甚至可以不定义构造函数。例4.5的程序就是由于基类的构造函数没有参数,所以派生类没有向基类传递参数。
派生类不能继承基类中构造函数和析构函数。当基类含有带参数的构造函数时,派生类必须定义构造函数,以提供把参数传递给基类构造函数的途径。
在C++中,派生类构造函数的一般格式为:
派生类名(参数总表):基类名(参数表)
派生类新增数据成员的初始化语句 
} 
其中,基类构造函数的参数,通常来源于派生类构造函数的参数总表,也可以用常数值。
//例4.6 当基类含有带参数的构造函数,派生类构造函数的构造方法。

#include
#include
using namespace std;class Student{ //声明基类Student public: Student(int number1,string name1,float score1) //基类的构造函数 { number = number1; name = name1; score = score1; } void print() { cout<<"number:"<
<

注意事项:

请注意派生类构造函数首行的写法:

UStudent(int number1,string name1,float score1,string major1):Student(number1,name1,score1)
冒号前面的部分是派生类构造函数的主干,它和以前介绍过的构造函数的形式相同,但它的总参数表中包括基类构造函数所需要的参数和对派生类新增的数据成员初始化所需要的参数。冒号后面的部分是要调用的基类构造函数及其参数。
从上面列出的派生类UStudent构造函数首行中可以看到,派生类构造函数名(UStudent)后面的总参数表中包括参数的类型和参数名(如 int number1),而基类构造函数的参数表中只有参数名而不包括参数类型(如 number1),因为在这里不是再定义基类构造函数,而是调用基类构造函数,因此这些参数是实参而不是形参。它们可以是派生类构造函数总参数表中的参数,也可以是常量和全局变量。
说明:1、可以将派生类构造函数定义在类的外部,而在类体内只写该函数的声明。如在例4.6的派生类中可以只写构造函数的声明:
UStudent(int number1,string name1,float score1,string major1) 
而在类外定义派生类的构造函数:
UStudent::UStudent(int number1,string name1,float score1,string major1):Student(number1,name1,score1)
{
          major = major1;
请注意:在类中声明派生类构造函数时,不包括基类构造函数及其参数表(Student(number1,name1,score1),只在
类外定义构造函数时才将它列出。
2、若基类使用默认构造函数或不带参数的构造函数,则在派生类中定义构造函数时, "基类构造函数名(参数表)"可以省略。 
如在例4.5的程序中,由于基类的构造函数没有参数,所以在派生类中定义构造函数时,不要缀上":Base()",也即
不必写成:

Deirved:Base()

{
cout<<"Constructor derived class"<<endl;
}

3、当基类构造函数不带参数时,派生类不一定需要定义构造函数,然而当基类的构造函数哪怕只带有一个参数,它所有的派生类必须定义构造函数,甚至所定义的派生类构造函数的函数体可能为空,仅仅起到参数的传递作用。

例如,在下面的程序中,派生类Deruved就不使用参数n,n只是被传递给基类构造函数Base。

class Base{                public:                  Base(int n)                  {                    i = n;                  }                  void show()                  {                    cout<<"i="<<

2.派生类的析构函数

在派生类中可以根据需要定义自己的析构函数,用来对派生类中的所增加的成员进行清理工作。基类的清理工作仍然有基类的析构函数负责。由于析构函数是不带参数的,在派生类中是否要定义析构函数与它所属基类的析构函数无关。在执行派生类的析构函数时,系统会自动调用基类的析构函数,对基类的对象进行清理。析构函数的调用顺序与构造函数正好相反,先执行派生类的析构函数,再执行基类的析构函数。

//例4.7 简单派生类的构造函数和析构函数的执行顺序。

#include
using namespace std;class A{ //声明基类A public: A() { cout<<"Constuctor class A"<

3.含有对象成员(子对象)的派生类的构造函数

当派生类中含有内嵌的对象成员(也称子对象)时,其构造函数的一般格式为:

派生类(参数总表):基类名(参数表 0):对象成员1(参数表 1),......,对象成员n(参数表 n)

{
派生类新增成员的初始化语句 
}
在定义派生类对象时,构造函数的执行顺序如下:
(1)、调用基类的构造函数,对基类数据成员初始化;
(2)、调用内嵌对象成员的构造函数,对内嵌对象成员的数据成员进行初始化;
(3)、调用派生类的构造函数体,对派生类数据成员进行初始化。
撤销对象时,析构函数的调用顺序与构造函数的调用顺序相反,首先执行派生类的析构函数,
再执行内嵌对象成员的析构函数,最后执行基类的析构函数。 
//例4.8 含有对象成员的派生类构造函数和析构函数的执行顺序

#include
using namespace std;class Base{ //声明基类Base public: Base(int i) //基类的构造函数 { x = i; cout<<"Constructor base class"<

说明:

(1)在派生类中含有多个内嵌对象成员时,调用内嵌对象成员的构造函数顺序由它们在类中声明的顺序确定。
(2)如果派生类的基类也是一个派生类,每个派生类只需负责其直接基类数据成员。依次上溯。 
//例4.9 含有多个对象成员的派生类构造函数的执行顺序。

#include
#include
using namespace std;class Student{ //声明基类Base public: Student(int number1,string name1,float score1) { number = number1; name = name1; score = score1; } void print() { cout<<"学号:"<
<

 

程序猿神奇的手,每时每刻,这双手都在改变着世界的交互方式!
本文转自当天真遇到现实博客园博客,原文链接:http://www.cnblogs.com/XYQ-208910/p/4912347.html
,如需转载请自行联系原作者
你可能感兴趣的文章
源码分析之 LinkedList
查看>>
免SDK实现微信/支付宝转账打赏功能
查看>>
安卓.9图片制作
查看>>
MySQL 高可用性keepalived+mysql双主
查看>>
Python环境安装及数据基本预处理-大数据ML样本集案例实战
查看>>
【详解】TiDB 2.0 GA is here !
查看>>
iOS开发-模拟网络环境
查看>>
Redux执行流程梳理
查看>>
iOS 指纹识别
查看>>
说说 Vue.js 组件
查看>>
iPhone 用USB连接SSH的时候一直报错
查看>>
关于Vuex的action传入多个参数的问题
查看>>
放弃jQuery, 使用原生js
查看>>
跨越适配&性能那道坎,企鹅电竞Android weex优化
查看>>
一文读懂鼠标滚轮事件(wheelEvent)
查看>>
腾讯云国内节点centos7.2安装k8sv1.12.3
查看>>
Python爬虫--- 1.5 爬虫实践: 获取百度贴吧内容
查看>>
解决Shell脚本$'\r': command not found问题
查看>>
ionic3使用百度地图
查看>>
JavaWEB开发11——JSP
查看>>