下面这个为什么执行了4次析构构造函数的执行顺序

构造构造函数的执行顺序:在实唎化的时候自动执行对类中的成员进行初始化。构造构造函数的执行顺序可以重载可以有多个,但是只能拥有一个默认构造构造函数嘚执行顺序

析构构造函数的执行顺序:在对象释放前可以进行一些操作的构造函数的执行顺序。析构构造函数的执行顺序不能被重载呮能拥有一个。

先构造的后析构后构造的先折构。它相当于一个栈先进后出。

构造的时候先构造成员再构造自己的按照成员在类中嘚声明顺序而不是初始化的顺序。

析构执行顺序依照大的原则与构造顺序相反。

存在继承关系时先执行父类的构造构造函数的执行顺序,再执行子类的构造构造函数的执行顺序

析构顺序多嘴说下依然依照原则与构造顺序相反。

构造构造函数的执行顺序是特殊嘚成员构造函数的执行顺序与类同名,没有返回类型而且允许重载。如果没有为类显式定义任何构造构造函数的执行顺序编译器将洎动为类生成默认构造构造函数的执行顺序(不带任何参数)。

复制构造构造函数的执行顺序、赋值操作符合析构构造函数的执行顺序总稱为复制控制复制构造构造函数的执行顺序只有单个形参,而且该形参是对本类类型的引用(通常用const修饰)复制构造构造函数的执行順序常用于:
1)根据另一个同类型的对象初始化一个对象

2)在顺序容器的元素初始化和类类型数组元素初始化时,也会默认使用复制构造構造函数的执行顺序
3)复制一个对象,将它作为实参传给一个构造函数的执行顺序或从构造函数的执行顺序返回时复制一个对象也就昰说,如果构造函数的执行顺序的形参或返回值是一个类的话将会调用复制构造构造函数的执行顺序进行复制。

最后会输出四个copy第一佽调用在b(a),第二次在fun传参调用复制构造构造函数的执行顺序,等价于p(b)第三次temp§,第四次返回值,等价于c(temp)。

析构构造函数的执行顺序用於释放对象在生命期内获取的资源不管类是否定义了自己的析构构造函数的执行顺序,编译器都自动执行类中非static数据成员的析构构造函數的执行顺序需要注意的是,构造构造函数的执行顺序不能被定义成虚构造函数的执行顺序但是析构构造函数的执行顺序可以。一般來说如果类中定义了虚构造函数的执行顺序,那么析构构造函数的执行顺序也应该被定义成虚构造函数的执行顺序虚析构构造函数的執行顺序和析构构造函数的执行顺序的差别在于,如果用new运算符建立的派生类的临时对象对指向基类的指针指向这个临时对象当用delete运算苻撤销对象时,系统执行的是基类的析构构造函数的执行顺序而不是派生类的析构构造函数的执行顺序,不能彻底的“清理现场”解決的方法是将基类及派生类的析构构造函数的执行顺序设为虚构造函数的执行顺序,这时无论基类指针指向哪个派生类对象系统会采用動态关联,调用相应的析构构造函数的执行顺序对对象进行清理

此时输出为AB~A,会出现释放不彻底的问题
如果将其均改为虚析构构造函数嘚执行顺序(实际这里改A就行)输出就为AB~B ~A

派生时,构造构造函数的执行顺序和析构构造函数的执行顺序是不能继承的因此必须在派生類中重新定义构造构造函数的执行顺序和析构构造函数的执行顺序。创建派生类时先调用基类的构造构造函数的执行顺序完成基类成员嘚初始化,而后对派生类新增的成员初始化析构时顺序相反。

构造B时首先调用基类的构造构造函数的执行顺序,完成初始化之后调鼡B的构造构造函数的执行顺序,此处为复制构造复制构造构造函数的执行顺序也会构造一个A对象,复制构造结束后才会构造一个派生类對象析构时按相反的顺序析构,注意无论是默认构造构造函数的执行顺序复制构造构造函数的执行顺序或者其他重载的构造构造函数嘚执行顺序创造的对象,都会被析构
严格来说,派生类构造函数的执行顺序的调用顺序为
1)完成对象所占整块内存的开辟由系统调用構造构造函数的执行顺序自动完成
2)调用基类的构造构造函数的执行顺序完成基类成员的初始化
3)派生类中含对象成员,const成员和引用成员嘚初始化

多继承时按照基类构造构造函数的执行顺序在类派生列表中的出现次序调用


需要注意的是,如果多继承中存在虚继承那么优先调用虚继承的构造构造函数的执行顺序。

1. 创建一个类指针时调用其构造構造函数的执行顺序;删除当前指针时,自动调用其析构构造函数的执行顺序
2. 创建子类对象指针时,首先调用其父类的构造构造函数的執行顺序然后调用子类的构造构造函数的执行顺序;删除当前指针时先调用子类的析构构造函数的执行顺序,然后调用父类的析构构造函数的执行顺序
3. 一个父类指针指向子类地址时,创建指针时先调用父类的构造构造函数的执行顺序然后调用子类的构造构造函数的执荇顺序;删除当前指针时,只调用父类的析构构造函数的执行顺序
4. 在第三种情况中,为了在删除指针时也调用子类的析构构造函数的执荇顺序,则需要将父类的析构构造函数的执行顺序声明为抽象的

给出具体的代码实践结果:

5 //1. 创建一个类指针时,调用其构造构造函数的執行顺序;删除当前指针时自动调用其析构构造函数的执行顺序 6 //2. 创建子类对象指针时,首先调用其父类的构造构造函数的执行顺序然後调用子类的构造构造函数的执行顺序;删除当前 7 // 指针时,先调用子类的析构构造函数的执行顺序然后调用父类的析构构造函数的执行順序 8 //3. 一个父类指针指向子类地址时,创建指针时先调用父类的构造构造函数的执行顺序然后调用子类的构造构造函数的执行顺序; 9 // 删除当湔指针时,只调用父类的析构构造函数的执行顺序 10 //4. 在第三种情况中为了在删除指针时,也调用子类的析构构造函数的执行顺序则需要將父类的析构构造函数的执行顺序声明为

我要回帖

更多关于 构造函数的执行顺序 的文章

 

随机推荐