阿里巴巴2009研发类c++笔试题一道

来源:百度知道 编辑:UC知道 时间:2024/06/23 11:55:13
#include <iostream.h>
class A
{
public:
A(){cout<<"A"<<endl;}
~A(){cout<<"~A"<<endl;}
};

class B

{public:
B(A &a):_a(a){cout<<"B"<<endl;}
~B(){cout<<"~B"<<endl;}
private:
A _a;
};
int main()
{
A a;
B b(a);
return 0;
}
输出结果是:A B ~B ~A ~A
为什么有两个~A析构函数呢?
构造函数和析构函数不是一一对应的吗?
请高手指点
请解释一下具体的构造函数和析构函数的调用过程 谢谢~~!~~

你没看见...B类里面有一个A的对象_a吗?
int main()
{
A a;//此时运行A的构造函数
B b(a);//此时运行B的构造函数,在这里给_a赋值用的是默认参数列表,调用的是A类的默认拷贝构造函数,所以不会再运行一次会执行输出的构造函数
return 0;//此时运行B的析构函数,在B析构的时候发现有B::_a,然后再调用_a的析构函数,最后才是a的析构函数
}

哎,悲剧...我也应该去应聘的

类B中有一个私有成员变量_a,类型为A。
main函数中创建类B的对象b时,调用的构造函数是:
B(A &a):_a(a){cout<<"B"<<endl;}
这个函数中的_a(a)表示用类A的对象a去初始化变量_a。
这一步调用的是类A的拷贝构造函数,这个函数是类A中没有声明,c++自动替类A生成的,因此其中没有调用cout<<"A"<<endl;。
B在析构时,其成员变量_a也同时析构,调用了类A的析构函数cout<<"~A"<<endl;。

综上,对于_a,构造函数和析构函数依然是一一对应的,只不过构造时调用的是拷贝构造函数,没有输出,而析构时输出了"~A"。

因为用A的对象来初始化B的成员,也就是说B b(a)让A的对象有了一个副本,第一个~A是副本的析构,第二个~A是这个对象的析构。