1.5.2 初窥成员函数
不幸的是,将Sales_item相加的程序有一个问题。如果输入指向了两个不同的ISBN将发生什么?将两个不同ISBN的数据相加没有意义。为解决这个问题,首先检查Sales_item操作数是否都具有相同的ISBN。
#include <iostream> #include "Sales_item.h" int main() { Sales_item item1, item2; std::cin >> item1 >> item2; // first check that item1 and item2 represent the same book if (item1.same_isbn(item2)) { std::cout << item1 + item2 << std::endl; return 0; // indicate success } else { std::cerr << "Data must refer to same ISBN" << std::endl; return -1; // indicate failure } } |
这个程序和前一个程序不同之处在于if测试语句以及与它相关联的else分支。在解释if语句的条件之前,我们明白程序的行为取决于if语句中的条件。如果测试成功,那么产生与前一程序相同的输出,并返回0表示程序成功运行完毕。如果测试失败,执行else后面的语句块,输出信息并返回错误提示。
1. 什么是成员函数
上述if语句的条件
// first check that item1 and item2 represent the same book if (item1.same_isbn(item2)) { |
调用命名为item1的Sales_item对象的成员函数。成员函数是由类定义的函数,有时称为类方法。
成员函数只定义一次,但被视为每个对象的成员。我们将这些操作称为成员函数,是因为它们(通常)在特定对象上操作。在这个意义上,它们是对象的成员,即使同一类型的所有对象共享同一个定义也是如此。
当调用成员函数时,(通常)指定函数要操作的对象。语法是使用点运算符(.运算符):
意思是“命名为item1的对象的same_isbn成员”。点运算符通过它的左操作数取得右操作数。点运算符仅应用于类类型的对象:左操作数必须是类类型的对象;右操作数必须指定该类型的成员。
与大多数其他运算符不同,点运算符(“.”)的右操作数不是对象或值,而是成员的名字。
通常使用成员函数作为点运算符的右操作数来调用成员函数。执行成员函数和执行其他函数相似:要调用函数,可将调用运算符[“()”运算符]放在函数名之后。调用运算符是一对圆括号,括住传递给函数的实参列表(可能为空)。
same_isbn函数接受单个参数,且该参数是另一个Sales_item对象。函数调用
将item2作为参数传递给名为same_isbn的函数,该函数是名为item1的对象的成员。它将比较参数item2的ISBN与函数same_isbn要操作的对象item1的ISBN。其效果是测试两个对象是否具有相同的ISBN。
如果对象具有相同的ISBN,执行if后面的语句,输出两个Sales_item对象的和。否则,如果对象具有不同的ISBN,则执行else分支的语句块。该块输出适当的错误信息并退出程序,返回-1。回想main函数的返回值被视为状态指示器。本例中,返回一个非零值表示程序未能产生期望的结果。
习题
习题1.24 编写程序读入几笔不同的交易。对于每笔新读入的交易,要确定它的ISBN是否和以前的交易的ISBN一样,并且记下每一个ISBN的交易的总数。通过给定多笔不同的交易来测试程序。这些交易必须代表多个不同的ISBN,但是每个ISBN的记录应分在同一组。
< xml:namespace prefix = std />
【责任编辑:
董书 TEL:(010)68476606】