C++构造函数和析构函数执行顺序

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

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

 1 #include <iostream>
 2 using namespace std;
 3
 4 //四种情况:
 5 //1. 创建一个类指针时,调用其构造函数;删除当前指针时,自动调用其析构函数
 6 //2. 创建子类对象指针时,首先调用其父类的构造函数,然后调用子类的构造函数;删除当前
 7 //     指针时,先调用子类的析构函数,然后调用父类的析构函数
 8 //3. 一个父类指针指向子类地址时,创建指针时先调用父类的构造函数,然后调用子类的构造函数;
 9 //     删除当前指针时,只调用父类的析构函数
10 //4. 在第三种情况中,为了在删除指针时,也调用子类的析构函数,则需要将父类的析构函数声明为
11 //   抽象的
12
13 #define SAFE_DELETE(p) {delete (p);(p) = NULL;}
14
15 class Person
16 {
17 public:
18     Person(){
19         cout<<"Person 构造函数"<<endl;
20     }
21     virtual ~Person(){
22         cout<<"Person 析构函数"<<endl;
23     }
24
25 };
26
27 class Son : public Person
28 {
29 public:
30     Son(){
31         cout<<"Son 构造函数"<<endl;
32     }
33     ~Son(){
34         cout<<"Son 析构函数"<<endl;
35     }
36
37 };
38
39 int main(int argc, char const *argv[])
40 {
41     Person *mPerson = new Person();
42     SAFE_DELETE(mPerson);
43
44
45     cout<<endl<<endl;
46
47     Son *mSon = new Son();
48     SAFE_DELETE(mSon);
49
50     cout<<endl<<endl;
51
52     Person *mPerson2 = new Son();
53     SAFE_DELETE(mPerson2);
54
55
56     return 0;
57 }

结果:

Person 构造函数
Person 析构函数

Person 构造函数
Son 构造函数
Son 析构函数
Person 析构函数

Person 构造函数
Son 构造函数
Son 析构函数
Person 析构函数
时间: 2024-08-08 22:46:36

C++构造函数和析构函数执行顺序的相关文章

c++派生类中构造函数和析构函数执行顺序、判断对象类型、抽象类、虚函数

一. 代码: 1 #include<stdio.h> 2 #include<string.h> 3 #include<algorithm> 4 #include<iostream> 5 using namespace std; 6 class A 7 { 8 public: 9 int a,b; 10 A(); 11 A(int x,int y); 12 ~A(); 13 }; 14 A::A() 15 { 16 printf("调用A类构造函数\

虚函数构造和析构函数执行顺序总结

一.定义 虚函数: 在某基类中声明为 virtual 并在一个或多个派生类中被重新定义的成员函数,可实现函数成员的动态重载. 纯虚函数: 纯虚函数是一种特殊的虚函数,在许多情况下,在基类中不能对虚函数给出有意义的实现,而把它声明为纯虚函数,它的实现留给该基类的派生类去做.含有纯虚函数的类被称为抽象类(abstract class) 二.格式 虚函数:virtual <函数返回类型>< 函数名>(<参数表>) {函数体}: 纯虚函数:virtual <函数返回类型&

静态代码块、非静态代码块、构造函数之间的执行顺序

1.执行顺序 静态代码块>非静态代码块>构造函数 public class staticCode { public staticCode() { System.err.println("构造函数"); } { System.err.println("非静态代码块"); } static{ System.err.println("静态代码块"); } public static void main(String[] args) { ne

C#构造函数的执行顺序

<1> using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 构造函数的执行顺序 { public class MyBaseClass { public MyBaseClass() { Console.Write("调用父类无参数的构造函数"); } public MyBaseClass(int i) { Console.Write(&q

父类,子类,静态属性,静态代码块,构造代码块,构造函数,执行顺序

1 package demo; 2 //父类 3 public class FatherClass { 4 5 private static String strFather="父类静态属性----1"; 6 7 static{ 8 System.out.println("父类静态代码块----1"); 9 } 10 11 { 12 System.out.println("父类构造代码块----3"); 13 } 14 15 public Fat

C++_构造函数与析构函数

构造函数与析构函数 OOP第二课 1 构造函数 1.1 构造函数具有一些特殊的性质 1.2 定义构造函数的一般形式 1.3 利用构造函数创建对象 2 成员初始化表 3 缺省参数的构造函数 4 重载构造函数 5 拷贝构造函数 5.1 自定义拷贝构造函数 5.2 缺省的拷贝构造函数 5.3 调用拷贝构造函数的三种情况 5.4 浅拷贝和深拷贝 6 析构函数 7 调用构造函数和析构函数的顺序 8 对象的生存期 构造函数和析构函数都是类的成员函数,但它们都是特殊的成员函数,执行特殊的功能,不用调用便自动执

构造函数、析构函数、虚析构函数、纯虚析构函数要点总结

1.派生类的构造函数.析构函数默认会调用基类的构造函数.析构函数. 顺序:基类构造.派生类构造:派生类析构,基类析构. 举例: 1 /****************************************************************************************************** 2 * File:Constructor&DestructorTest 3 * Introduction:测试构造函数.析构函数.虚构造函数与纯虚构造函数的一些

C++学习基础十——子类构造函数与析构函数的执行

1.子类构造函数的执行: 先执行父类的构造函数,再执行成员对象的构造函数,最后执行自身的构造函数. 当继承多个类时,构造函数的 执行顺序与继承时的顺序 相同,而与子类构造函数调用父类构造函数的顺序无关. 2.子类析构函数的执行: 先执行自身析构函数,再执行成员对象的析构函数,最后执行父类的析构函数 . 当继承多个类时,父类析构函数的执行过程与构造函数的执行过程相反 3.代码如下: 1 #include <iostream> 2 #include <string> 3 4 using

继承构造函数的执行顺序

转自:http://blog.csdn.net/daheiantian/article/details/6438782 Code: #include <iostream> using namespace std; class A { public: A() { cout<<"int A::A()"<<endl; } A(A &a) { cout<<"int A::A(A &a)"<<endl