6.9 访问函数与工具函数
并非所有成员函数都要用 public 指定为类接口的一部分。有些成员函数保持 private,作为类中 其他函数的工具函数(utility function)。
软件工程视点 6.17
成员函数分为几大类:读取和返回私有数据成员值的函数、设置私有数据成员值的函数、实现类特性的 函数和进行各种类操作的函数(如初始化类对象、指定类对象、将类与内部类型或其他类进行相互转换以及处理奥对象内存)。
访问函数可以读取和显示数据。访问函数的另一常见用法是测试条件的真假,这种函数称为判定函数(predicate funchon)。任何容器类都有的isEmpty函数(如链表、堆栈和队列)就是判定函 数。程序先测试isEmpty,再从容器对象中读取下一个项目。判定函数isFull于测试容器类对象还有没有多余的存储空间。Time类的判定函数包括isAM和isPM。
图 6.7 演示了工具函数(或称为帮助函数)的使用。工具函数不是类接口的一部分,而是 private 成员函数,支持类中其他函数的操作。类的客户不能使用工具函数。
1 // Fig. 6.7: salesp.h
2 // SalesPerson Class definition
3 // Member functions defined in salesp.cpp
4 #ifndef SALESPH
5 #define SALESPH
6
? class SalesPerson {
8 public:
9 SalesPerson(); // constructor
10 void getSalesFromUser(); // get sales figures from keyboard
11 void setSales( int, double ); // User supplies one month's
12 // sales figures.
13 void printAnnualSales();
14
15 private:
16 double totalAnnualSales(); // utility function
17 double sales[ 12 ]; // 12 monthly sales figures
18 };
19
20 #endif
21 // Fig. 6.7: salesp.cpp
22 // Member functions for class SalesPerson
23 #include <iostream.h>
24 #include <iomanip.h>
26
27 // Constructor function initializes array
28
29 {
30 for (int i = 0; i < 12; i++ )
31 sales[ i ] = 0.0;
32 }
34 // Function to get 12 sales figures from tha user
35 // at the keyboard
37 {
38 double salesFigure;
40 for (int i = 0; i < 12; i++ ) {
41 cout << "Enter sales amountfor month"
<< i + 1 << ": ";
43 cin >> salesFigure;
44 setSales( i, salesFigure );
45 }
46 }
47
48 // Function to set one of the 12 monthly sales figures.
49 Note that the month value must be from 0 to 11
50 void SalesPerson::setSales( int month, double amount )
51 {
52 if ( month >= 0 && month < 12 && amount > 0 )
53 sales[ month ] = amount;
54 else
55 cout << "Inalid month or sales figure" << endl;
56 }
57
58 // Print the total annual sales
59 void SalesPerson::printAnnualSales()
6O {
61 cout << setprecision( 2 )
62 << setiosflags( ios::fixed I ios::showpoint )
63 << "\nThe total annual sales are: $"
64 << totalAnnualSales() << endl;
65 }
67 // Private utility function to total annual sales
68 double SalesPerson::totalAnnualSales()
69 {
70 double total = 0.0;
71
72 for (int i = 0; i < 12; i++ )
73 total += sales[ i ];
74
75 return total;
76 }
77 // Fig.67:fig06_07.cpp
78 // Demonstrating a utility function
79 // Compile with salesp.cpp
80 #include "salesp.h"
81
82 int main()
83 {
84 SalesPerson s; // create SalesPerson object s
85
86 s.getSalesFromUser(); // note simple sequential code
87 s.printAnnualSales(); // no control structures in main
88 return 0;
89 }
输出结果:
Enter sales amount for month 1:5314.76
Enter sales amount for month 2:4292.38
Enter sales amount for month 3:4589.83
Enter sales amount for month 4:5534.03
Enter sales amount for month 5:4376.34
Enter sales amount for month 6:5698.45
Enter sales amount for month 7:4439.22
Enter sales amount for month 8:5893.57
Enter sales amount for month 9:4909.67
Enter sales amount fez month 10:5123.45
Enter sales amount for month 11:2024.97
Enter sales amount for month 12:5923.92
The total annual sales are: $60120.58
图 6.7 使用工具函数
SalesPerson 类中的表示12个月销售数据的数组用构造函数初始化为0,并用 setSales 函数设置为用户提供的值。public 成员函数 printAnnualSales 打印最近11个月的总销售额。工具函数,TotalAnnualSales 为 PrintAnnualSales 计算12个月的总销售额。成员函数 printAnnudSales 将销售数据转换为美元金额格式。
注意 main 中只有一个简单的成员函数调用,没有任何控制结构。
软件工程视点 6.18
面向对象编程的一个现象是定义类之后,生成和操作这个类的对象通常只要一个简单的成员函数调用,没有任何或只有少量控制结构。相反,类成员函数的实现则通常需要控制结构。