這章用關鍵字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;//標誌失敗
}
}