• 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 析构函数
  • 相关阅读:
    hive学习
    spark Streaming
    spark sql
    参考
    数论基础
    2020.07.17模拟3
    2020.07.16模拟2
    关于Linux环境下的对拍
    2020.07.15模拟1
    三体
  • 原文地址:https://www.cnblogs.com/calence/p/6964605.html
Copyright © 2020-2023  润新知