8.2类的组合
- 使用组合类定义对象,即组合类对象,其成员中也将包含对象成员和非对象成员
2.访问组合类对象中的非对象成员
组合类对象名 . 非对象成员名
•组合类对象中的对象成员还包含自己的下级成员,也就是说组合类对象包含多级成员。可以访问组合类对象中对象成员的下级成员,这是一种多级访问。多级访问的语法形式是:
组合类对象名 . 对象成员名 . 对象成员的下级成员名
•多级访问将受到多级权限的控制
组合类对象的构造与析构
3.–组合类的构造函数
组合类构造函数名( 形参列表 ) : 对象成员名1( 形参1 ), 对象成员名2( 形参2 ), ……
{
…… // 在函数体中初始化其它非对象成员
}
–组合类对象中各数据成员的初始化顺序是:先调用对象成员所属类的构造函数,初始化对象成员;再执行组合类构造函数的函数体,初始化其它非对象成员
–如果组合类中有多个对象成员,那么这些对象成员的初始化顺序由其在组合类中的声明顺序决定,先声明者先初始化
组合类TriCircle可添加如下3个重载构造函数
–有参构造函数
TriCircle :: TriCircle( double p0, double p1, double p2 ) : c0(p0), c1(p1), c2(p2)
{ }
–无参构造函数。
TriCircle :: TriCircle( ) { }
–拷贝构造函数
TriCircle :: TriCircle( TriCircle &rObj ) : c0(rObj.c0), c1(rObj.c1), c2(rObj.c2) { }
TriCircle obj( 5, 2, 3 );
TriCircle obj1;
TriCircle obj2( obj );
组合类的析构函数
–当对象生存期结束时,计算机销毁对象,释放其内存空间,这个过程就是对象的析构。销毁对象时计算机会自动调用其所属类的析构函数
–组合类对象中数据成员的析构顺序是:先执行组合类析构函数的函数体,清理非对象成员;再调用对象成员所属类的析构函数,清理对象成员
–简单地说,对象的析构顺序与构造顺序相反,即先析构非对象成员,再析构对象成员
类的聚合
例8-3 聚合类pTriCircle的定义代码
类头文件:pTriCircle.h
类源程序文件:pTriCircle.cpp
#include “Circle.h” // 声明类Circle
class pTriCircle // 声明部分,即声明成员
{
public:
Circle *p0, *p1, *p2; // 公有Circle类的对象指针
double TArea( ); // 求总面积:公有函数成员
double TLen( ); // 求总周长:公有函数成员
};
#include “pTriCircle.h” // 声明类pTriCirclepTriCircle类:实现部分,具体的函数代码
double pTriCircle :: TArea( ) // 求总面积
{
double totalArea;
totalArea = p0->CArea( ) +
p1->CArea( ) + p2->CArea( );
return totalArea;
}
double pTriCircle :: TLen( ) // 求总周长
{
double totalLen;
totalLen = p0->CLen ( ) +
p1->CLen( ) + p2->CLen( );
return totalLen;
}
#include <iostream>
using namespace std;
#include “pTriCircle.h” // 类pTriCircle的声明头文件 main( )
{
Circle c0, c1, c2; // 先定义3个类Circle的对象c0、c1、c2
c0.Input( ); c1.Input( ); c2.Input( ); // 输入3个圆的半径
pTriCircle obj1; // 定义1个聚合类pTriCircle的对象obj1
// 将obj1中3个对象指针分别指向已经创建的Circle类对象c0、c1、c2
obj1.p0 = &c0; obj1.p1 = &c1; obj1.p2 = &c2;
// 调用obj1中的函数成员TArea和TLen,计算并显示总面积和总周长
cout << obj1.TArea( ) << “, ” << obj1.TLen( ) << endl;
pTriCircle obj2; // 定义1个聚合类pTriCircle的对象obj2
// 将obj2中3个对象指针也分别指向Circle类对象c0、c1、c2
obj2.p0 = &c0; obj2.p1 = &c1; obj2.p2 = &c2;
// 调用obj2中的函数成员TArea和TLen,计算并显示总面积和总周长
cout << obj2.TArea( ) << “, ” << obj2.TLen( ) << endl;
return 0;
}
类的组合与聚合
–数据成员中包含对象成员的类称为组合类
–数据成员中包含对象指针的类称为聚合类,聚合类是一种特殊形式的组合类
•聚合类与组合类的区别
–聚合类的对象成员是独立创建的,聚合类对象只包含指向对象成员的指针
–聚合类对象可以共用对象成员