指出下面程序的输出结果:
<span style="font-size:14px;">/*************************************************************************
> File Name: test.cpp
> Author:
> Mail:
> Created Time: 2016年01月16日 星期六 20时32分46秒
************************************************************************/
#include <iostream>
using namespace std;
class A
{
public:
A(){cout << "A" << endl;}
~A(){cout << "~A" << endl;}
};
class B
{
public:
B(){cout << "B" << endl;}
B(A & a):_a(a){cout << "B(a)" << endl;}
~B(){cout << "~B" << endl;}
private:
A _a;
};
int main()
{
A a;
B b(a);
return 0;
}
</span>
这个题目是考察对构造函数和析构函数以及复制构造函数的了解
1: A a; 该语句会调用类A的构造函数,所以会输出A;
2: B b(a); 该语句中的a是上面的对象,所以不会再次输出A,又因为该语句是生成对象b并调用类B的复制构造函数,会输出B(a);
你可能会奇怪,对象b中有一个成员是对象_a ,但是没有输出A,这是因为在生成对象b的时候也是生成对象_a的时候,它会调用类A的复制构造函数,此时是不会调用类A的构造函数的,所以不会输出A。
3: 构造函数和析构函数是对称的。当离开程序的时候会执行对象的析构函数。首先是执行对象b的析构函数(输出~B),再是对象b中对象_a的析构函数(输出~A),最后会执行对象a的析构函数(输出~A)。
程序的输出结果如下:
<span style="font-size:14px;">A
B(a)
~B
~A
~A</span>
例子2:将main函数里声明一个类B的对象c ,main函数如下:
<span style="font-size:14px;">int main()
{
B c;
return 0;
}</span>
B c; 首先会调用类A的构造函数来构造对象_a输出A,然后调用类B的构造函数输出B;
离开程序的时候会先执行类B的析构函数输出~B,然后再调用类A的析构函数输出~A;
程序的输出结果如下:
A
B
~B
~A