返回信息流初始化一个类对象的时候,先初始类的成员变量,再调用构造函数。销毁对象的时候,顺序相反。
大家同意我的观点么?
题目如下:
请写出下面程序的输出结果:
class A
{
public:
A(){ cout<<"A()"<<endl;}
~A(){ cout<<"~A()"<<endl;}
};
class B
{
public:
B(){ cout<<"B()"<<endl; }
~B(){ cout<<"~B()"<<endl; }
private:
A a;
};
class C :public B
{
public:
C(){ cout<<"C()"<<endl;}
~C(){cout<<"~C()"<<endl;}
private:
B b;
A a;
};
int _tmain(int argc, _TCHAR* argv[])
{
C* p = new C;
delete p;
return 0;
}
这是一条镜像帖。来源:北邮人论坛 / cpp / #44666同步于 2010/10/11
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
今天网宿笔试碰到的一道题
starwars
2010/10/11镜像同步10 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
$ ./a.out
A()
B()
A()
B()
A()
C()
~C()
~A()
~B()
~A()
~B()
~A()
嵌套太多了。。。。。 谁解释一下吧
【 在 starwars (East Direction Red) 的大作中提到: 】
: 初始化一个类对象的时候,先初始类的成员变量,再调用构造函数。销毁对象的时候,顺序相反。
: 大家同意我的观点么?
: 题目如下:
: ...................
我覺得應該是這樣的:
A() // 這行和下一行是爲了構造C類對象的基類部份調用的
B() //
A() // 這兩行是構造C類對象的數據成員b調用的
B() //
A() // 這一行是構造C類對象的數據成員a調用的
C() // 這行是C類構造函數的,當然是構造它C類而調用的了
~C() // 析構C類對象
~A() // 這兩行是析構C的數據成員b
~B() //
~A() // 這一行是析構C的數據成員a
~B() // 這兩行詩析構C的基類部份
~A() //
正解!
析构函数顺序和构造函数顺序正好相反,先构造哪个,就后析构哪个。
【 在 potatossss 的大作中提到: 】
: 我覺得應該是這樣的:
: A() // 這行和下一行是爲了構造C類對象的基類部份調用的
: B() //
: ...................
【 在 potatossss 的大作中提到: 】
: 我覺得應該是這樣的:
: A() // 這行和下一行是爲了構造C類對象的基類部份調用的
: B() //
: ...................
大牛,我怎么觉得你的和沙发的相矛盾。。可是感觉你的对,沙发的我想不明白
【 在 Bluerainer 的大作中提到: 】
:
: 【 在 potatossss 的大作中提到: 】
: : 我覺得應該是這樣的:
: ...................
就是在创建派生前先创建基类,在调用自己的构造函数前现调用类成员的构造函数
有点问题。。。
构造过程没有问题,构造顺序为先基类后子类,若存在对象成员,先构造对象成员,最后构造自身。
析构解释有问题:
先析构子类后析构父类没有问题,析构应该是一个调用过程,在自己析构函数退出时,调用成员对象的析构函数,但是顺序变了,构造时成员对象是按照定义顺序构造的,但是析构时顺序是相反的,因此析构的解释是先调用~C,退出~C之前再调用~A,然后再调用~B,这时候当然会再调用A,此时子类C析构完毕,再析构B,因此还会调用~B和~A。
可以这样验证一下:再定义一个D,作为C的成员对象放在其最后,结果是~C调用之后先调用~D。有点晕~。。。
【 在 potatossss 的大作中提到: 】
: 我覺得應該是這樣的:
: A() // 這行和下一行是爲了構造C類對象的基類部份調用的
: B() //
: ...................
標準裏面有規定析構數據成員的順序嗎?我沒看過標準,不知道,但是按照構造數據成員的順序來析構數據成員理論上是可行的吧,所以,你即使驗證過,那也只能說明用於驗證的編譯器實現而已;但是反過來,如果標準有規定,我說那個就不對,析構那一段我是按照成員定義順序析構的
【 在 wangzb 的大作中提到: 】
: 有点问题。。。
: 构造过程没有问题,构造顺序为先基类后子类,若存在对象成员,先构造对象成员,最后构造自身。
: 析构解释有问题:
: ...................