组合类构造函数
引言
最近在学习C++的过程中看到组合类构造函数时,发现有2种初始化方式,为了找出其区别,特意写了个小程序来测试。
测试程序如下:
int main()
{
class XB {
public:
XB(int xx, int yy) :x(xx),y(yy){cout << "XB::constructor!" << endl;}
XB(XB &xb):x(xb.x),y(xb.y) {cout << "XB::copy!" << endl;}
private:
int x;
int y;
};
class XA
{
public:
XA(XB a) :xb(a) { cout << "XA::constructor!" << endl; }//第一种写法
XA(int xx, int yy) :xb(xx, yy) { cout << "XA::constructor!" << endl;}//第二种写法
XA(XA &xa) :xb(xa.xb){ cout << "XA::copy!" << endl; }
private:
XB xb;
};
XB xb_1(1, 2);//调用XB构造函数
XB xb_2(xb_1);//调用XB构造函数
XA xa_1(xb_1);//调用XB的复制构造函数2次,再调用XA的构造函数;
XA xa_2(3,4);//调用XA构造函数
return 0;
}
结果如图:
这里需要说明的是:1、XA xa_1(xb_1) 调用的是XB的复制构造函数而非构造函数,至于调用2次,我的理解是在传递参数时调用一次,在执行 xb(xb_1) 再调用一次;2、区分派生类的初始化:派生类是基类名(参数表),组合是对象名(参数表)。
假如XB中没有定义复制构造函数,则会调用默认的复制构造函数,把XB的复制构造函数注释掉,结果如图:
xa_2调用默认复制构造函数,因此没有输出。