c++学习之类的组合、聚合

来源:互联网 发布:mac os 10.12.6怎么样 编辑:程序博客网 时间:2024/05/31 19:29

8.2类的组合

  1. 使用组合类定义对象,即组合类对象,其成员中也将包含对象成员和非对象成员

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” // 声明类Circleclass 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、c2c0.Input( ); c1.Input( ); c2.Input( ); // 输入3个圆的半径pTriCircle obj1; // 定义1个聚合类pTriCircle的对象obj1// 将obj1中3个对象指针分别指向已经创建的Circle类对象c0、c1、c2obj1.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、c2obj2.p0 = &c0; obj2.p1 = &c1; obj2.p2 = &c2;// 调用obj2中的函数成员TArea和TLen,计算并显示总面积和总周长cout << obj2.TArea( ) << “, ” << obj2.TLen( ) << endl;return 0;}

这里写图片描述

类的组合与聚合
–数据成员中包含对象成员的类称为组合类
–数据成员中包含对象指针的类称为聚合类,聚合类是一种特殊形式的组合类
•聚合类与组合类的区别
–聚合类的对象成员是独立创建的,聚合类对象只包含指向对象成员的指针
–聚合类对象可以共用对象成员