• 析构函数小结


    析构函数在以下3种情况时被调用:

    • 1. 对象生命周期结束被销毁时
    • 2. delete指向对象的指针时,或者delete指向对象的基类类型的指针,而基类析构函数是虚函数
    • 3. 对象A是对象B的成员,B的析构函数被调用时,对象A的析构函数也会被调用

    类声明:

    class A
    {
    protected:
        int age;
    public:
        virtual void print();
        A(int );
        ~A();
    };
    class B : public A
    {
    public:
        void print();
        B(int);
        ~B();
    };
    class C
    {
    private:
        A a;
    public:
        C(A temp);
        ~C();
    };

    类定义:

    A::A(int t):age(t)
    {
        cout << "constructor A!" << endl;
    }
    void A::print()
    {
        cout << "print A!" << endl;
    }
    A::~A()
    {
        cout << "destructor A!" << endl;
    }
    
    B::B(int t):A(t)
    {
        cout << "constructor B!" << endl;
    }
    void B::print()
    {
        cout << "print B!" << endl;
    }
    B::~B()
    {
        cout << "destructor B!" << endl;
    }
    C::C(A temp):a(temp)
    {
        cout << "constructor C!" << endl;
    }
    C::~C()
    {
        cout << "destructor C!" << endl;
    }

    测试1:

    int main()
    {
        A* a1;
        return 0;
    }

    从运行结果可以看出,声明指针并不会调用构造函数,也不会调用析构函数。

    测试2:

    int main()
    {
        A a(10);
        return 0;
    }
    //结果constructor A!
    //destructor A!

    生命周期结束的时候,自动调用析构函数。

    测试3:

    int main()
    {
        B b(10);
        return 0;
    }
    //结果

    constructor A!
    constructor B!
    destructor B!
    destructor A!

    
    

    生成派生类时,先调用基类的构造函数,再调用派生类构造函数。析构函数调用顺序与构造函数调用顺序相反,类似于栈的先进后出原则。

    测试4:

    int main()
    {
        B* b = new B(10);
        return 0;
    }

    //结果
    constructor A!
    constructor B!

    对象使用new创建分配的时候,系统不会自动调用析构函数。所以,此时要手动调用析构函数。

    测试5:

    int main()
    {
        B* b = new B(10);
        delete b;
        return 0;
    }
    //结果
    constructor A!
    constructor B!
    destructor B!
    destructor A!

    使用delete,显示调用析构函数。

    测试6:

    int main()
    {
        C c(A(20));
        return 0;
    }
    //结果
    constructor A!
    constructor C!
    destructor A!
    destructor C!
    destructor A!
     
     

    当A对象是C的成员,C的析构函数调用时,也会调用A的析构函数。运行结果中A的析构函数比构造函数多运行一次,是因为在参数传递时,会调用A的复制构造函数(未显示定义,调用默认的复制构造函数)。

  • 相关阅读:
    Dumpbin 工具的使用
    ffmpeg Windows下采集摄像头一帧数据,并保存为bmp图片
    directdraw显示yuv视频,出现屏保时,yuv显示不出来,表面丢失
    DirectX截图黑屏的解决办法
    VS2008 Project : error PRJ0019: 某个工具从以下位置返回了错误代码: "正在执行生成后事件..."解决方案
    RoundingMode 几个参数详解
    IDEA导入eclipse项目并部署运行完整步骤(转发)
    Intellij idea操作maven时控制台中文乱码
    java 替换json字符串中间的引号保留两边的引号,避免json校验失败
    分布式ID解决方案
  • 原文地址:https://www.cnblogs.com/inception6-lxc/p/9365629.html
Copyright © 2020-2023  润新知