标签:
类的组合
1. 定义和描述
组合类构造函数定义(注意不是声明)的一般形式为:
类名::类名(形参表):内嵌对象1(形参表),内嵌对象2(形参表),...
{
类的初始化
}
其中,“内嵌对象1(形参表),内嵌对象2(形参表),...”成为初始化列表,可以用于完成对内嵌对象的初始化。其实,一般的数据成 员也可以这样初始化,就是把这里的内嵌对象都换成一般的数据成员,后面的形参表换成用来的初始化一般数据成员的变量形参,比如 ,Point::Point(int xx, int yy):X(xx),Y(yy) { },这个定义应该怎么理解呢?就是我们在构造Point类的对象时传入实参初始化 xx和yy,然后用xx的值初始化Point类的数据成员X,用yy的值初始化数据成员Y。
类的组合其实描述的就是在一个类里内嵌了其他类的对象作为成员的情况,它们之间的关系是一种包含与被包含的关系。简单说,一 个类中有若干数据成员是其他类的对象。以前的教程中我们看到的类的数据成员都是基本数据类型的或自定义数据类型的,比如int、 float类型的或结构体类型的,现在我们知道了,数据成员也可以是类类型的。
如果在一个类中内嵌了其他类的对象,那么创建这个类的对象时,其中的内嵌对象也会被自动创建。因为内嵌对象是组合类的对象的 一部分,所以在构造组合类的对象时不但要对基本数据类型的成员进行初始化,还要对内嵌对象成员进行初始化
2. 构造函数的调用顺序
组合类的构造函数的调用顺序是根据组合类的初始化列表来一一执行的,按照内嵌对象在组合类的声明中出现的次序,依次调用内嵌对 象的构造函数,然后再执行本类的构造函数的函数体。如果声明组合类的对象时没有指定对象的初始值的话,就会自动调用无形参的构 造函数,构造内嵌对象时也会对应的调用内嵌对象的无形参的构造函数。
Example:
class Point
{
public:
Point(int X, int Y);
private:
int X;
int Y;
}
Point::Point(Point &p)
{
}
class Distance
{
public:
Distance(Point a, Point b);
private:
Point p1, p2;
}
Distance::Distance(Point a, Point b):p1(a), p2(b)
{
}
在Distance中先调用p1的构造函数,再调用p2的构造函数,因为在Distance中内嵌对象Point的声明顺序是p1,p2
3. 类组合的特殊情况
当两个类相互包含时,即类A有类B的内嵌对象,类B中也有类A的嵌入对象时,在C++中,要使用一个类必须在使用前先声明该类, 但是两个类互相包含时就肯定是有一个类在定义之前就被引用了,这时候就要用到 -->前向引用声明
前向引用声明是在引用没有定义的类之前对该类进行声明,这只是为程序声明一个代表该类的标识符,类的具体定义可以在程序 的其他地方,简单说,就是声明下这个标识符是个类,它的定义你可以在别的地方找到。
Example:
类A的公有成员函数f的形参是类B的对象,同时类B的公有成员函数g的形参是类A的对象,这时就必须使用前向引用声明:
class B; //前向引用声明
class A
{
public:
void f(B b);
};
class B
{
public:
void g(A a);
};
标签:
原文地址:http://www.cnblogs.com/201112701206lee/p/4586716.html