当前位置: 首页 > 文档资料 > C++大学教程 >

6.8 控制对成员的访问

优质
小牛编辑
115浏览
2023-12-01

成员访问说明符 public 和 private(和第9章 继承 中介绍的 protected)可以控制类数据成员和成员函数的访问。类的默认访问模式是private,因此类的首部和第一个标号之间的所有成员的类型都是 private。每个标号之后,采用该标号表示的方式,直到遇到下一个标号或遇到类定义的右花括号(})。标号public、private和protedted可以重复,但这种情况不常用,容易造成混乱。

类的 private 成员只能由类的成员函数(和第7章介绍的友元)访问,public 成虽则可以由程序中的任何函数访问。

public 成员的主要用途是向类的客户提供类的服务(行为),这组服务形成类的 public 接口。类的客户不必关心类如何完成任务。类的 private 成员和 public 成员函数的定义是类的客户无法访问的。

这些组件形成类的实现方法(implementation)。

软件工程视点 6.13
C++ 提倡程序独立于实现方法。对于独立于实现方法的代码,改变类的实现方法时,代码不需要改变,但可能需要重新编译。

常见编程错误 6.6
除了由类的成员函数(和第7章介绍的友元)访问外,其他函数想访问类的private成员是个语法错误。

图 6.6 演示了 private 类成员只能用public成员函数通过public类接口访问。编译这个程序时,编译器产生两个错误,表示每个语句中指定的private成员无法访问。图6.6包含 time1.h 并和图 6.5 的 time1.cpp 一起编译。

编程技巧 6.3
如果在类定义中先列出 private 成员,尽管程序默认的访问模式为private,但最好还是显式使用private标号,这样可以使程序更清晰。我们喜欢先列出public成员以强调类的接口。

1 // Fig. 6.6:fig06 06.cpp
2 // Demonstrate errors resulting from attempts
3 // to access private class members.
4 #include <iostream.h>
5 #include "time1.h"
6
7 int main()
8 {
9 Time t;
10
11 // Error: 'Time::hour' is not accessible
12 t.hour = 7;
13
14 // Error: 'Time::minute' is not accessible
15 cout << "minute =" << t.minute;
16
17 return 0;
18 }

输出结果:

Compilin9 FIG06 06.CPP:
Error FIG06 06.CPP 12: 'Time::hour' is not accessible
Error FIG06_06.CPp 15: 'Time::minute' is not accessible

图 6.6 访问类的 private 成员的错误

编程技巧 6.4

尽管public和private标号可以重复和混合,但最好先将所有public成员列成一组,然后将所有private成员列成一组,这样可以使客户集中注意类的public接口,而不是注意类的实现方法。

软件工程视点 6.14
让类的所有数据成员保持private。让Public成员函数设置private数据成员的值并取得private数据成员的值。这种结构能隐藏类的实现方法,减少错误和提高程序的可修改性。

类的客户可能是另一类的成员函数,也可能是全局函数(即文件中类c语言的“松散”函数,不是任何类的成员函数)。

类成员的默认访问方式为private。类成员的访问方式可以显式设置为 public、protected(见第9章)和 private。struct 成员的默认访问方式为 public。struct 的成员的访问方式也可以设置为 Public、protected 或 private。

较件工程视点 6.15
类设计人员用 public、protected 或 private 成员实现信息隐藏和最低权限原则。

类数据为 private 并不表示客户不能改变这个数据。客户可以通过这个类的成员函数或友元改变这个数据,但这些函数的设计应保证数据完整性。

访问类的 private 数据应当用称为访问函数access funotion)或访问方法(access method)的成员函数严格控制。例如,要让客户读取private数据的值,类可以提供一个get函数。要让客户修改 private 数据的值,类可以提供一个 set 函数。这种修改似乎会破坏 private 数据的专用性,但set成员函数可以提供数据验证功能(如范围检查),保证数值设置正确,set 函数也可以在接口使用的数据形式与实现方法使用的数据形式之间进行换算。get 函数不必以原始形式显示数据,该函数可以编辑数据,限制客户可以看到的数据。

软件工程视点 6.16
类设计人员不必提供每个 private 数据成员的 get 和 set 函数,只在需要时才提供数据成员的 get 和 set 函数。

测试与调试提示 6.3
将类的数据成员指定为 private、类的成员函数指定为 public 有助于调试,因为数据操作问题局部化在类成员函数或类的友元中。