在类中定义的数据成员一般都是基本数据类型或服复合数据类型。但是还可以根据需要使用
其他类的对象作为正在声明的数据成员。复杂的对象还可以有比较简单的对象一某种方式组合
而成,复杂对象和组成它的简单对象之间的关系是组合关系。

在一个类中内嵌另一个类的对象作为数据成员,称为类的组合。该内嵌对象称为对象成员,也称为
子对象。例如:

class A
{
       .......
};
class B
{
       A a; //类A的对象a为类B的对象成员
       public:
       ....
};

当创建类的对象时,如果这个类具有内嵌对象成员,那么内嵌对象成员也将被自动创建,因此,
在创建对象时既要对本类的基本数据成员初始化,又要对内嵌的对象成员进行初始化。含有对象
成员的类,其构造函数和不含对象成员的构造函数有所不同,例如有以下的类X:
class X{
              类名1 对象成员 1;
              类名2 对象成员 2;
              .................
             类名n 对象成员 n;
           };

一般来说,类X的构造函数的定义形式为:
X::X(形参表0):对象成员1(形参表1),对象成员2(形参表2),对象成员3(形参表3),....
{
      //类的构造函数体
}

其中,"对象成员1(形参表1),对象成员2(形参表2),对象成员3(形参表3),...."称作初始化表,其作用
是对对象成员进行初始化。
当调用构造函数X::X()时,首先按各内嵌对象成员在类声明中的顺序依次调用他们的构造函数,对这些
对象初始化。最后在执行类X的构造函数体,初始化类X的其他成员。析构函数的调用顺序与构造函数的
调用顺序相反。

例:  对象成员的初始化

#include<iostream>
using namespace std;
class A{ //声明类A
public:
A(int x1,float y1)
{
x = x1;
y = y1;
}
void show()
{
cout<<"x="<<x<<endl;
cout<<"y="<<y<<endl;
}
private:
int x;
float y;
};
class B{ //声明类B
public:
B(int x1,float y1,int z1):a(x1,y1) //类B的构造函数,含有初始化列表,用与对内嵌对象a进行初始化
{
z = z1;
}
void show()
{
a.show();
cout<<"z="<<z<<endl;
}
private:
A a; //类A的对象a为类B的对象成员
int z;
};
int main()
{
B b(,,);
b.show(); return ;
}

需求:定义学生类和成绩类,将student类的成员score作为成绩类的一个对象 ,然后用初始化
列表进行初始化。
例 :对象成员的应用

#include<iostream>
#include<string>
using namespace std;
class Score{ //声明类Score
public:
Score(float m,float l,float E);
void show();
private:
float math;
float language;
float English;
};
Score::Score(float m,float l,float E) //定义构造函数
{
math = m;
language = l;
English = E;
}
void Score::show()
{
cout<<"数学的成绩是:"<<math<<endl;
cout<<"语文的成绩是:"<<language<<endl;
cout<<"英语的成绩是:"<<English<<endl;
}
class Student{ //声明类student
public:
Student(char* n,char* s,float m,float l,float E); //声明构造函数
~Student(); //声明析构函数
void show();
private:
char* name; //学生姓名
char* sno; //学生学号
Score Sco; //对象成员,是类Score的对象
};
Student::Student(char* n,char* s,float m,float l,float E):Sco(m,l,E) //定义构造函数
{
name = new char[strlen(n)+];
strcpy(name,n);
sno = new char[strlen(n)+];
strcpy(sno,s);
}
Student::~Student()
{
delete []name;
delete []sno;
}
void Student::show()
{
cout<<"学生的姓名是:"<<name<<endl;
cout<<"学生的学号是:"<<sno<<endl;
Sco.show();
}
int main()
{
Student stu1("张三","",98.3,98.6,99.1); //定义类student的对象stu1,调用stu1的构造函数,
//初始化对象stu1
stu1.show(); //调用stu1的show(),显示stu1的数据
cout<<endl; Student stu2("李四","",98.8,98.5,99.5);
stu2.show();
cout<<endl;
}

从上面的程序可以看出,类student的show函数中对于对象成员Sco的处理方式就是通过调用类Score的show函数
来实现的。

说明:
1、声明含有对象的类,首先要创建对象成员。本例在声明类Studet中,定义了对象成员Sco;
Score Sco;

2、在定义类Student的对象,调用构造函数进行初始化的同时,也要对对象成员进行初始化,因为它
属于此类的成员。因此在写类Student的构造函数时,也缀上了对象成员Sco要调用类Score的构造
函数。
Student::Student(char* n,char* s,float m,float l,float E):Sco(m,l,E){}
这时构造函数的调用顺序是:先调用对象成员Sco的构造函数,对对象成员的数据成员进行初始化。
随后再执行类Student的构造函数的函数体,对派生类数据成员进行初始化。

注意:在定义类Student的构造函数时,必须缀上对象成员的名字Sco,而不能缀上类名。。。

C++:类的组合的更多相关文章

  1. c++基础语法 构造函数 析构函数 类的组合

    1 构造函数 1.不能指定任何返回值,甚至连void都不能有. 2.与Java不同,c++不同new对象,对于无参的构造函数声明对象时括号应该省略. 2 析构函数 1. 前加~,不能有参数,不能有返回 ...

  2. c++,类的组合

    1. 在A类中以B类的对象作为成员变量,称为类的组合(composition). 可以先看看这篇文章理解组合的用处: C++中组合的使用 http://blog.csdn.net/jia_xiaoxi ...

  3. 【C++基础】类的组合

    所谓类的组合是指:类中的成员数据是还有一个类的对象或者是还有一个类的指针或引用.通过类的组合能够在已有的抽象的基础上实现更复杂的抽象. 比如: 1.按值组合 #include<iostream. ...

  4. C++类的组合例子

    Line类调用Point类的两个对象p1,p2作为其数据成员,计算线段长度 组合类构造函数定义的一般形式为: 类名::类名(形参表):内嵌对象1(形参表),内嵌对象2(形参表)... {类的初始化} ...

  5. python - class类 (三) 类的组合

    类的组合: #组合 class A1(): def pr(self): return 'a1' class A2(): def pr(self): return 'a2' class A3(): de ...

  6. python类的组合

    类的组合,即在类实例化时,将另一个类的实例作为参数传入,这样可以将两个实例关联起来. 当类之间有显著不同,并且较小的类是较大的类所需要的组件时,用组合比较好. 例如,描述一个机器人类,这个大类是由很多 ...

  7. day25类的组合多态封装

    类的组合多态与封装类的组合 1. 什么是组合  组合指的是某一个对象拥有一个属性,该属性的值是另外一个类的对象 2. 为何要用组合  通过为某一个对象添加属性(属性的值是另外一个类的对象)的方式,可以 ...

  8. Java编程的逻辑 (14) - 类的组合

    ​本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...

  9. 7 python 类的组合

    1.组合与重用性 软件重用的重要方式除了继承之外还有另外一种方式,即:组合 组合指的是,在一个类中以另外一个类的对象作为 1.一个类的属性可以是一个类对象,通常情况下在一个类里面很少定义一个对象就是它 ...

随机推荐

  1. 通过xsd生成xml类

    步骤二:使用VS2010 Tools中的命令提示窗口 如下图所示 执行结果:生成myschema.xsd对应的C#类文件. 命令剖析: /c  生成对应的类文件 /l:cs 类文件使用C#语言 /ou ...

  2. Python数据结构——栈、队列的实现(二)

    1. 一个列表实现两个栈 class Twostacks(object): def __init__(self): self.stack=[] self.a_size=0 self.b_size=0 ...

  3. 在Windows 上安装SQL Server的一些注意事项

    基本来说安装SQL Server 单节点数据库并不是很困难的事情,大多可以通过Next来安装完成.其中要注意以下几点 安装.net3.5 可以参考本Blog的一些安装须知. Windows Serve ...

  4. DATE,DATETIME,DATETIME2等日期时间数据类型

    日期范围广 0001-01-01 到 9999-12-31.时间范围广 00:00:00 到 23:59:59.9999999. -----------------DATE --只存储日期 selec ...

  5. 【转载】MySQL查询阻塞语句

    select r.trx_id waiting_trx_id, r.trx_mysql_thread_Id waiting_thread,        r.trx_query waiting_que ...

  6. Python 安装 httpie

    Python 安装 httpie 前段时间开发RESTful的程序,使用浏览器插件HttpRequester,挺高级,易用的.后来在RESTHeart项目中认识了httpie,感觉高大上.在使用htt ...

  7. Problem 1007 幸运数 线段树成段更新

    题目链接: 题目 Problem 1007 幸运数 Time Limit: 2000 mSec Memory Limit : 131072 KB 问题描述 皮特的幸运数是2和5.只由幸运数字2和5组成 ...

  8. 基于密度的聚类之Dbscan算法

    一.算法概述 DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一个比较有代表性的基于密度的聚类算法.与划分和层次 ...

  9. 【转载】错误 CS0016: 未能写入输出文件“c:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/Temporary ASP.NET Files/.........dll”--“拒绝访问。 ”

    win7中安装asp.net的问题 编译器错误信息: CS0016: 未能写入输出文件问题解决办法 编译错误 说明: 在编译向该请求提供服务所需资源的过程中出现错误.请检查下列特定错误详细信息并适当地 ...

  10. PAT-乙级-1053. 住房空置率 (20)

    1053. 住房空置率 (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 在不打扰居民的前提下,统计住房空 ...