【C++ primer学习】2.6自定义数据结构

这章用关键字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 <string>

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<iostream>
#include<string>
#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<<data1.bookNo<<" "<<totalCnt<<" "<<totalRevenue<<" ";
        if (totalCnt!=0)
            std::cout<<totalRevenue/totalCnt<<std::endl;
        else
            std::cout<<"(no sales)"<<std::endl;
        return 0;//标志成功
        }else{  //两笔交易的ISBN值不一样
            std::cerr<<"Data must refer to the same ISBN"<<std::endl;
            return -1;//标志失败
        }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章