这章用关键字struct构建Sale_data类。并不是一个完整的类,知识尝试把数据元素组织到一起。
Scale_data定义为:
struct Sale_data{
std::string bookNo;
unsigned units_sold=0;//售出量
double revenue=0.0;//销售收入
};
注意:C++新标准规定,可以为数据成员提供给一个类内初始值。
没有初始值的成员将被默认初始化。定义于任何函数体之外的变量被初始化为0。定义在函数体内部的内置变量将不被初始化。一个未被初始化的内置类型变量的值是未定义的,这时候如果进行拷贝操作或者以其他形式访问将会引发错误。
编写自己的头文件
类通常被定义在头文件中,而且类所在头文件的名字应与类的名字一致。
头文件通常包含哪些只能只能被顶一次的实体,如类、const、constexpr变量。
接下来我们要实现Sale_data类的定义(Sale_data.h文件中),并在主函数中将ISBN编号相同的书籍的收入和进行相加(main.cpp文件中)。因为涉及到字符串操作,在以上两个文件中都会包含string.h头文件。使用Sale_data类的程序先后包含了两次string.h头文件。一次是直接包含(main.c中),一次是随着包含Sale_data.h被隐式地包含进来的。在书写头文件时需要做适当处理,为了确保头文件多次包含仍能安全工作要使用预处理器技术。
预处理器概述
预处理器是在编译之前执行的一段程序,可以部分改变我们编写的程序。
(1)#include
(2)头文件保护符,头文件保护符依赖于预处理变量。预处理变量有两个状态:已定义和未定义。
#define指令把一个名字设定为预处理变量#
#ifdef 当且仅当变量已定义时为真
#ifndef当且仅当变量未定义时为真。一旦检查结果为真,则执行后续操作,直到遇见#endif指令为止。
以下是sale_data.h的代码
#ifndef SALE_DATA_H
#define SALE_DATA_H
#include
struct Sale_data{
std::string bookNo;
unsigned units_sold=0;//售出量
double revenue=0.0;//销售收入
};
#endif // SALE_DATA_H
如果SALE_DATA_H预处理变量未被定义,则定义SALE_DATA_H预处理变量并导入string头文件,定义sale_data类。直到遇见#endif结束。
以下是mian.cpp代码:
#include
#include
#include "Sale_data.h"
int main()
{
Sale_data data1,data2;
double price=0;//书的单价,用于计算销售收入
//读入data1和data2
std::cin>>data1.bookNo>>data1.units_sold>>price;
data1.revenue=data1.units_sold*price;
std::cin>>data2.bookNo>>data2.units_sold>>price;
data2.revenue=data2.units_sold*price;
//检查data1和data2的ISBN是否相同
if(data1.bookNo==data2.bookNo){
unsigned totalCnt=data1.units_sold+data2.units_sold;//总册数
double totalRevenue=data1.revenue+data2.revenue;//总收入
//输出:ISBN、总销售量、平均价格
std::cout<