类的组合——在一个类里内嵌了其他类的对象作为成员的情况,它们之间的关系是一种包含与被包含的关系。
如果在一个类中内嵌了其他类的对象,那么创建这个类的对象时,其中的内嵌对象也会被自动创建。因为内嵌对象是组合类的对象的一部分,所以在构造组合类的对象时不但要对基本数据类型的成员进行初始化,还要对内嵌对象成员进行初始化。
组合类构造函数定义的一般形式为:
类名::类名(形参表):内嵌对象1(形参表),内嵌对象2(形参表),...
{
类的初始化
}
比如,Point::Point(int xx, int yy):X(xx),Y(yy) { },这个定义应该怎么理解呢?就是我们在构造Point类的对象时传入实参初始化xx和yy,然后用xx的值初始化Point类的数据成员X,用yy的值初始化数据成员Y。
这些构造函数的调用是什么顺序呢?首先,根据前面说的初始化列表,按照内嵌对象在组合类的声明中出现的次序,依次调用内嵌对象的构造函数,然后再执行本类的构造函数的函数体。
例如:
#include <iostream>
using namespace std;
class Point
{
public:
Point(int xx,int yy){ X=xx; Y=yy; } //构造函数
Point(Point &p);
int GetX(void){ return X; } //取X坐标
int GetY(void){ return Y; } //取Y坐标
private:
int X,Y; //点的坐标
};
Point::Point(Point &p)
{
X = p.X;
Y = p.Y;
cout << "Point拷贝构造函数被调用" << endl;
}
class Distance
{
public:
Distance(Point a,Point b); //构造函数
double GetDis() { return dist; }
private:
Point p1,p2;
double dist; // 距离
};
// 组合类的构造函数
Distance::Distance(Point a, Point b):p1(a),p2(b)
{
cout << "Distance构造函数被调用" << endl;
double x = double(p1.GetX() - p2.GetX());
double y = double(p1.GetY() - p2.GetY());
dist = sqrt(x*x + y*y);
return;
}
int main()
{
Point myp1(1,1), myp2(4,5);
Distance myd(myp1, myp2);
cout << "The distance is:";
cout << myd.GetDis() << endl;
return 0;
}
输出结果为:
Point拷贝构造函数被调用
Point拷贝构造函数被调用
Point拷贝构造函数被调用
Point拷贝构造函数被调用
Distance构造函数被调用
The distance is:5