同样,上述类将数据成员声明为私有的。这

发布时间:2024年01月23日

同样,上述类将数据成员声明为私有的。这意味着 Student 类的成员函数可以使用 string 和
valarray<double>类的公有接口来访问和修改 name和scores对象,但在类的外面不能这样做,而只能通过
Student 类的公有接口访问 name和scores(请参见图14)。对于这种情况,通常被描述为Student类获得了
其成员对象的实现,但没有继承接口。例如,Student对象使用string的实现,而不是char* name 或char name
[26]实现来保存姓名。但Student对象并不是天生就有使用函数 string operator+=()的能力。

Student 对象

name

string 对象

name.size()<

scores

valarray<double> 对象

scores.sum( )

通过name对象调用
String类的公有方
法来访问

通过scores对象调用
valarray<double>
类的公有方法来访问

// contained object

图14.1 对象中的对象:包含

接口和实现
使用公有继承时,类可以继承接口,可能还有实现(基类的纯虚函数提供接口,但不提供实现)。获得
接口是is-a关系的组成部分,而使用组合,类可以获得实现,但不能获得接口。不继承接口是has-a关系
的组成部分、

对于has-a关系来说,类对象不能自动获得被包含对象的接口是一件好事。例如,string类将+操作符
重载为将两个字符串连接起来;但从概念上说,将两个Student 对象串接起来是没有意义的。这也是这里
不使用公有继承的原因之一。另一方面,被包含的类的接口部分对新类来说可能是有意义的。例如,可能
希望使用string接口口中的operator<()方法将Student对象按姓名进行排序,为此可以定义Student :: operator<()
成员函数,它在内部使用string:operator<()函数。下面介绍一些细节。

14.1.3 Student 类范例

现在需要提供Student类的定义,当然它应包含构造函数以及一些用作Student类接口的方法。程序清
单14.1是Student类的定义,其中所有构造函数都被定义为内联的;它还提供了一些用于输入和输出的友
元函数。

程序清单 14.1 studentc.h
// studentc.h -- defining a Student class using containment
#ifndef STUDENTC_H
#define STUDENTC_H

#include <iostream>
finclude <string>
#include <valarray>
class Student

private:
typedef std :: valarray<double> ArrayDb;
std :: string name;

文章来源:https://blog.csdn.net/Popcorn_zyh/article/details/135761391
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。