主题:[讨论]经典程序 帮忙解答 赢高分
jinxiaomiss
[专家分:0] 发布于 2009-10-04 22:39:00
#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;
}
帮我解释一下
最后更新于:2009-10-05 11:22:00
回复列表 (共2个回复)
沙发
wwsxxz [专家分:0] 发布于 2009-10-05 09:31:00
自己编译一下看看!
板凳
QXVC [专家分:60] 发布于 2009-10-09 11:02:00
又是构造析构函数的问题~~~
首先要明确一个知识点:在向编译系统声明一个派生类对象的时候,系统先调用基类的构造函数,然后调用派生类的构造函数。析构函数的调用情况恰好相反:当程序所有语句完成的时候,系统会先调用派生类的析构函数,后调用基类的构造函数。这是基础知识,请熟悉掌握。
现在分析一下代码:主函数里声明了一个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类构造函数和析构函数的调用结果。
我来回复