当创建类的对象时,如果这个类具有内嵌的对象成员,那么各个内嵌对象也被自动创建(也要调用相应的
构造函数)。
此时构造函数的调用顺序是:
(1)按照内嵌对象在组合类的构造函数定义中出现的次序,依次调用内嵌对象的构造函数
(2)执行本类构造函数的函数体。
#include <iostream.h>
#include <math.h>
class Point
{
public:
Point(int xx=0,int yy=0)
{
X=xx;Y=yy;
cout<<"Point类构造函数被调用"<<endl;
} //内联构造函数
Point(Point &p);
int GetX(){return X;}
int GetY(){return Y;}
private:
int X,Y;
};
Point::Point(Point &p) //拷贝构造函数
{
X=p.X;
Y=p.Y;
cout<<"Point类拷贝构造函数被调用"<<endl;
}
class Distance
{
public:
Distance(Point xp1,Point xp2);
double GetDis(){return dist;}
private:
Point p1,p2;
double dist;
};
//组合类的构造函数
Distance::Distance(Point xp1,Point xp2):p1(xp1),p2(xp2)
//Distance::Distance(Point xp1,Point xp2):p1(0,0),p2(0,16)
//此处若修改成这样,则调用的是Point类的构造函数,而不是拷贝构造函数。
{
cout<<"Distance的构造函数被调用"<<endl;
double x=double(p1.GetX()-p2.GetX());
double y=double(p1.GetY()-p2.GetY());
dist=sqrt(x*x+y*y);
}
void main()
{
Point myp1(1,1),myp2(4,5); //此处Point类拷贝构造函数不做调用
Distance myd(myp1,myp2); //此处进行函数的型参和实参结合,Point类拷贝构造函数调用2次
// 要对内嵌的对象成员初始化,Point类拷贝构造函数调用2次,Distance类构造函数调用1次
cout<<"The diatance is:";
// cout<<myd.dist<<endl; 私有变量不能直接访问,只能通过接口成员函数访问
cout<<myd.GetDis()<<endl;
}