1.5 类简介
在C++中,我们通过定义一个类(class)来定义自己的数据结构(data structure)。一个类定义了一个类型,以及与其关联的一组操作。
类机制是C++最重要的特性之一。
本节中,将介绍一个编写书店程序中会用到的简单的类。在后续章节中学习了更多关于类型、表达式、语句和函数的知识后,会真正实现这个类。
为了使用类,需要了解三件事情:
- 类名是什么?
- 它是在哪里定义的?
- 它支持什么操作?
对于书店程序来说,假定类名为Sales_item,头文件Sales_item.h中已经定义了这个类。
为了使用标准库设施,必须包含相关的头文件。类似的,需要使用头文件来访问为自己的应用程序所定义的类。
习惯上,头文件根据其中定义的类的名字来命名。通常使用.h作为头文件的后缀,但也有一些程序员习惯.H、.hpp或.hxx。标准库头文件通常不带后缀。编译器一般不关心头文件名的形式,但有的IDE对此有特定的要求。
1.5.1 Sales_item类
Sales_item类的作用是表示一本书的总销售额、售出册数和平均售价。
每个类实际上都定义了一个新类型,其类型名就是类名。因此,Sales_item类定义了一个名为Sales_item的类型。与内置类型一样,可以定义类类型的变量:
Sales_item item;
表达item是一个Sales_item类型的对象,通常将这种说法简化为“一个Sales_item对象”或“一个Sales_item”。
除了可以定义Sales_item类型的变量之外,还可以:
- 调用一个名为isbn的函数从一个Sales_item对象中提取ISBN书号;
- 输入运算符(>>)和输出运算符(<<)读、写Sales_item类型的对象:
- 用赋值运算符(=)将一个Sales_item对象的值赋予另一个Sales_item对象;
- 用加法运算符(+)将两个Sales_item对象相加;
两个对象必须是同一本书(相同的ISBN);
加法结果是一个新的Sales_item对象,其ISBN与两个运算对象相同,其总销售额和售出册数则是两个运算对象的对应值和。 - 使用复合赋值运算符(+=)将一个Sales_item对象加到另一个对象上。
关键概念:类定义了行为
阅读这些程序时,一件要牢记的重要事情是,类Sales_item的作者定义了类对象可以执行的所有动作。即,Sales_item类定义创建了一个Sales_item对象时会发生什么事情,以及对Sales_item对象进行赋值、加法或输入输出运算时会发生什么事情。
读写Sales_item
从标准输入读入数据,存入一个Sales_item对象中,然后将Sales_item的内容写回到标准输出:
#include <iostream>
#include "Sales_item.h"
int main()
{
Sales_item book; /创建一个名为book的Sales_item对象
//读入ISBN号、售出的册数以及销售价格
std::cin >> book;
//写入ISBN、售出的册数、总销售额和平均价格
std::cout << book << std::endl;
return 0;
}
此程序以两个#include指令开始,其中一个使用了新的形式。包含来自标准库的头文件时,也应该用尖括号(< >)包围头文件名。对于不属于标准库的头文件,则用双引号(" ")包围。
Sales_item对象的加法
将两个Sales_item对象相加:
#include <iostream>
#include "Sales_item.h"
int main()
{
Sales_item item1, item2;
std::cin >> item1 >> item2;
std::cout << item1 + item2 << std::endl;
return 0;
}
使用文件重定向
测试程序时,反复从键盘敲入这些销售记录作为程序的输入是繁杂的。大多数操作系统支持文件重定向,这种机制允许将标准输入和标准输出与命名文件关联起来。
1.5.2 初识成员函数
将两个Sales_item对象相加的程序首先应该检查两个对象是否具有相同的ISBN,方法如下:
#include <iostream>
#include "Sales_item.h"
int main()
{
Sales_item item1, item2;
std::cin >> item1 >> item2 >>std::endl;
if (item1.isbn() == item2.isbn())
{
std::cout << item1 + item2 << std::endl;
return 0; //表示成功
}
else
{
std::err << "Data must refer to same ISBN" << std::endl;
return -1; //表示失败
}
}
if语句的检测条件
item1.isbn() == item2.isbn()
调用名为isbn的成员函数(member function)。成员函数是定义为类的一部分函数,有时也被称为方法(method)。
通常以一个类对象的名义来调用成员函数。例如,上面相等表达式左侧运算的第一部分
item1.isbn()
使用点运算符(.)来表达需要“名为item1的对象的isbn成员”。点运算符只能用于类类型的对象。其左侧运算对象必须是一个类类型的对象,右侧运算对象必须是该类型的一个成员名,运算结果为右侧运算对象指定的成员。
当用点运算符访问一个成员函数时,效果是调用该函数。使用调用运算符( ( ) )来调用一个函数。调用运算符是一对圆括号,里面防止实参(argument)列表(可能为空)。成员函数isbn并不接受参数。因此
item1.isbn()
调用名为item1的对象的成员函数isbn,此函数返回item1中保存的ISBN书号。
在这个if条件中,相等运算符的右侧运算对象也是这样执行的,它返回保存在item2中的ISBN书号。如果ISBN相同,条件为真,否则条件为假。
本文介绍了C++中的类机制,以Sales_item类为例,讲解如何定义类及类的成员函数。Sales_item用于表示书籍销售信息,包括总销售额、售出册数和平均售价。文中涉及了如何读写Sales_item对象,以及如何通过加法运算符处理相同ISBN的Sales_item对象。此外,还介绍了使用文件重定向进行测试和成员函数的概念。
823





