在一个类中内嵌另一个类的对象作为数据成员,称为类的组合。该内嵌对象称为对象成员,或者子对象。如三角形类Triangle类的内嵌Node类作为数据成员;
class Triangle{private: Node *nodei; //对象成员 Node *nodej; Node *nodem;public: ...};
在使用过程中,需要着重注意的是 对象成员的初始化!如Triangle的构造函数该如何定义?
如果一个类具有内嵌对象,那么在它对象化的时候既要对基本数据成员初始化也要对内嵌的对象成员初始化。
class X{ 类名1 对象成员名1; 类名2 对象成员名2; ... 类名n 对象成员名n;};
一般来说类X的构造函数定义形式为:
X::X(形参表0):对象成员名1(形参1),...,对象成员名n(形参n){ 类X的构造函数体}
形参1到n一般来自形参表0;而且当调用构造函数的时候,首先按照在类的声明中的顺序依次调用对象成员函数的构造函数,对这些对象初始化,最后执行够赞函数体初始化类中的其他数据成员;析构函数的调用顺序与构造函数相反!举例说明:
#includeusing namespace std;class Node{private: double x_; double y_;public: Node(double x=0,double y=0) //带默认参数的构造函数 { x_=x; y_=y; cout<<"x="< <
输出结果:
说明:如果类的内嵌对象是用指针表示的,如何初始化呢?这个时候用上述的初始化列表就失效了!
#includeusing namespace std;class Node{private: double x_; double y_;public: Node(double x=0,double y=0) //带默认参数的构造函数 { x_=x; y_=y; cout<<"x="< <
输出结果为:
显然这样定义构造函数既不直观(不知道那个参数对应那个点)也很麻烦!改为如下:
#includeusing namespace std;class Node{private: double x_; double y_;public: Node(double x=0,double y=0) //带默认参数的构造函数 { x_=x; y_=y; cout<<"x="< <
输出:
这样来定义构造函数既没有用到init()自定义的初始化函数,而且物理意义明确。
总结:1.有子对象的类的初始化问题。子对象不是直接用类名表示,可以用初始化列表初始化。
2.如果子对象用指针形式表示,就不能用初始化列表了。