回 帖 发 新 帖 刷新版面

主题:[讨论]经典程序   帮忙解答  赢高分

#include<iostream>
using namepace std;
class A
{
public:
   A(){cout<<"A";}
   ~A(){cout<<"A";}
};
classB:publicA
{
   A*p;
    public:
     B(){cout<<"B";p=new A();}
     ~B(){cout<<"~B";delete p;}
};
int main()
{
   B obj;
   return 0;
}
帮我解释一下   

回复列表 (共2个回复)

沙发

自己编译一下看看!

板凳

又是构造析构函数的问题~~~

   首先要明确一个知识点:在向编译系统声明一个派生类对象的时候,系统先调用基类的构造函数,然后调用派生类的构造函数。析构函数的调用情况恰好相反:当程序所有语句完成的时候,系统会先调用派生类的析构函数,后调用基类的构造函数。这是基础知识,请熟悉掌握。

    现在分析一下代码:主函数里声明了一个B类的对象obj,故系统第一步是调用父类A的构造函数,执行结果是输出一个字符串“A”,第二步,调用B类的构造函数,执行结果是先输出“B”,然后用new向系统申请一块A类大小的内存空间,将空间地址赋值给B类的私有成员A *p(A类的对象指针),这时又调用了一次A类的构造函数,故输出一个“A”。第三步,先调用子类B的析构函数,结果是先输出“~B”,然后使用delete语句删除第二步中申请存放一个A类对象的内存空间,这时调用了一次A类的析构函数,输出一个“A”,到此子类B的析构函数调用完毕。第四步,也是最后一步,调用父类A的析构函数,输出一个字符串“A”。
     
     故以上的结果是:ABA~BAA 

     给一个小小的建议:不妨将A类的析构函数改成~A() {cout<<"~A";},这样可以区分A类构造函数和析构函数的调用结果。


我来回复

您尚未登录,请登录后再回复。点此登录或注册