C++笔记:1.5 类简介

本文介绍了C++中的类机制,以Sales_item类为例,讲解如何定义类及类的成员函数。Sales_item用于表示书籍销售信息,包括总销售额、售出册数和平均售价。文中涉及了如何读写Sales_item对象,以及如何通过加法运算符处理相同ISBN的Sales_item对象。此外,还介绍了使用文件重定向进行测试和成员函数的概念。

1.5 类简介

在C++中,我们通过定义一个(class)来定义自己的数据结构(data structure)。一个类定义了一个类型,以及与其关联的一组操作。
类机制是C++最重要的特性之一。
本节中,将介绍一个编写书店程序中会用到的简单的类。在后续章节中学习了更多关于类型、表达式、语句和函数的知识后,会真正实现这个类。

为了使用类,需要了解三件事情:

  1. 类名是什么?
  2. 它是在哪里定义的?
  3. 它支持什么操作?

对于书店程序来说,假定类名为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相同,条件为真,否则条件为假。

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值