关于构造函数的问题

dadalan 2009-08-21 02:38:17
代码如下:

#include <iostream.h>
class A
{
public:
A(){ cout<<"construct A\n"<<endl;}
~A(){ cout<<"destruct A\n"<<endl;}
};

class B
{
public:
B(){cout<<"construct B\n"<<endl;}
~B(){cout<<"destruct B\n"<<endl;}
private:
A a;
};

void main()
{
B classB;
}

运行结构:
construct A

construct B

destruct B

destruct A

问题:
1. classB的成员属性a的构造函数为什么会被调用呢?
2. classB的成员属性a的构造函数为什么比B的构造函数先呢?
3. classB的成员属性a的析构函数为什么比classB还晚呢?既然classB都被析构了理论上就不存在了,此时再去调用a的析构函数就会出错。

备注:谢绝类似“建议楼主去看看C++基础书籍”这种自命清高,貌似牛人的菜鸟答案, 谢绝类似”构造函数顺序和析构函数顺序相反“这种书呆子答案。


...全文
152 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
BAKER_LEE 2009-08-21
  • 打赏
  • 举报
回复
构造函数是给类分配空间以后调用的函数。
析构函数是类空间回收前调用的函数。
当给B分配空间时,分配空间的依据是B中各成员的空间和,所以要先把B成员的空间都分配好了,B的空间就算分配结束,在这个过程中A的空间就先分配结束,先调用了A的构造函数,等B的成员都确定了,B的空间分配好了,再调用B的构造函数。
而析构则刚好相反,先删除B空间,在删除前调用B的析构,删除B的空间等价于删除B所有成员的空间,接下来删除A的空间,就调用了A的析构,诸如此类。。。
可能我的表达不是很清晰,请见谅。
haitaoyj0606 2009-08-21
  • 打赏
  • 举报
回复
我给你说个形象点的比喻吧,如果不对,欢迎指点,人在妈妈肚子里的时候,是先把心脏发育了,然后才是人的出生,而死的时候恰恰相反,显示心脏停止了跳动,这个人才是宣布死亡。心脏对于着类A,人对于着类B。
healer_kx 2009-08-21
  • 打赏
  • 举报
回复
哈哈,感冒好了~
雪影 2009-08-21
  • 打赏
  • 举报
回复
这是规定,没什么好解释的。
楼主要是懂些汇编的话,去你看类B对象中各部分的内存位置就知道为什么了。
dadalan 2009-08-21
  • 打赏
  • 举报
回复
healer_kx 我怕了你,我给点分给你好不好,别在这里瞎折腾了。
healer_kx 2009-08-21
  • 打赏
  • 举报
回复
建议楼主去看看C++基础书籍,另外再看看一些汇编基础的书籍,然后再用调试器看看构造函数的汇编代码是什么样子的。

另外你妈妈叫你回家吃饭了。
zhezhedongdong 2009-08-21
  • 打赏
  • 举报
回复
void main()
{
B classB;
}
这是定义一个B类的变量,那首先肯定要分配内存,分配内存时是发现里面有一个A类的变量,所以就先调用里面成员变量a的构造函数,然后再调用B类的构造函数,当main函数结束时,也就是变量生存期结束时会调用析构函数,析构函数特点是和构造函数配对的,就像IF。。。ELSE就近原则,所以先释放B,再释放A
socoola 2009-08-21
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 dadalan 的回复:]
你得0分,现在就判了
[/Quote]
不管怎么样,我觉得提问者要能虚心接受,有则改之,无则加勉,都是为了你好。
socoola 2009-08-21
  • 打赏
  • 举报
回复

3. classB的成员属性a的析构函数为什么比classB还晚呢?既然classB都被析构了理论上就不存在了,此时再去调用a的析构函数就会出错。
因此CLASS a的析构是在class b的析构函数中调用的,也就是说在b的析构过程中去destroy a的。
healer_kx 2009-08-21
  • 打赏
  • 举报
回复
继续“建议楼主去看看C++基础书籍”
dadalan 2009-08-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 healer_kx 的回复:]
因为a是b的成员,没有部分,哪有整体呢?
所以a不够完成,是不会有b的。

“建议楼主去看看C++基础书籍”
[/Quote]

你得0分,现在就判了
healer_kx 2009-08-21
  • 打赏
  • 举报
回复
因为a是b的成员,没有部分,哪有整体呢?
所以a不够完成,是不会有b的。

“建议楼主去看看C++基础书籍”

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧