下面代码的输出是什么?(D)
B、~B ~A
C、~B ~A ~A
class A
{
public:
A() { }
~A() { cout<<"~A"<<endl; }
};
class B:public A
{
public:
B(A &a):_a(a)
{
}
~B()
{
cout<<"~B"<<endl;
}
private:
A _a;
};
int main(void)
{
A a; //很简单,定义a的时候调用了一次构造函数
B b(a);
}
A、~B
B、~B ~A
C、~B ~A ~A
D、~B ~A ~A ~A
been:
B(A &a):_a(a)
这个引用也是值得注意的,这里提醒大家一下,去掉引用,第一个析构是是~A
灵灵:
下面以例子说明参数为类对象,是否有初始化列表时构造与析构函数的执行顺序:
#include <iostream>
using namespace std;
class A
{
public: A(){ cout<<"A"<<endl; }
A(const A& other){ cout<<"copy A"<<endl;}
~A() { cout<<"~A"<<endl; } };
class B:public A
{
public:
B(A a):_a(a) // B(A &a):_a(a) 会有完全不同的结果
{
cout<<"B"<<endl;
}
~B() { cout<<"~B"<<endl; }
private: A _a;
};
void main(void)
{
A a;
B b(a);
return;
}
运行结果:A //A a 创建对象a执行A类的构造
copy A //B b(a) 传参的时候利用A类的复制构造
A //创建对象B调用基类A的构造