<pre name="code" class="plain"><strong><span style="font-size:14px;"><strong>#ifndef SALESITEM_H // 若SALESITEM_H未被定義,則對其進行定義;#define SALESITEM_H// 自訂標頭檔Version_test;#include "Version_test.h" //Sales_item類定義的相關函數#include <iostream>#include <string>class Sales_item {/*定義為友元函數,重載輸入運算子>>;**第1個形參:運算子將要讀取的流的引用;第2個形參:將要讀入到的對象的引用;**第2個形參必須是非常量,因為本操作就是向此對象寫入資料,此對象值會改變;*/friend std::istream& operator>>(std::istream&, Sales_item&);/*定義為友元函數,重載輸出運算子<<;**第1個形參:非常量ostream對象的引用;第2個形參:一個常量的引用;**第1個形參必須是非常量,因為本操作就是向流寫入資料,其狀態會改變;**第2個形參:引用是因為避免賦值實參;常量是因為通常列印對象不會改變對象本身的值;*/friend std::ostream& operator<<(std::ostream&, const Sales_item&);/*定義為友元函數,重載關係運算子<;**第1個/第2個形參:一個常量的引用;**引用是因為避免改變實參;常量是因為比較對象並不需要改變對象本身的值;*/friend bool operator<(const Sales_item&, const Sales_item&);/*定義為友元函數,重載相等運算子==;**定義兩個對象是否相等,會比較對象的每一個資料成員,只有對應成員均相等時才相等;**第1個/第2個形參:一個常量的引用;**引用是因為避免改變實參;常量是因為比較對象並不需要改變對象本身的值;*/friend bool operator==(const Sales_item&, const Sales_item&);//定義公用成員public:/*這種傳遞中的代碼使用以下變數來控制編譯;**變數:IN_CLASS_INITS/DEFAULT_FCNS;對應C++作用:類初始狀態設定/default(預設);*/#if defined(IN_CLASS_INITS) && defined(DEFAULT_FCNS)//若定義類初始值設定及預設值,則定義預設建構函式,不接受任何實參; Sales_item() = default;#else/*若未定義類初始值及預設值,則定義建構函式,函數體空;**建構函式初始列表為新建立的資料成員units_sold/revenue初始化,對應初始化值為0/0.0;*/ Sales_item(): units_sold(0), revenue(0.0) { }#endif/*只有一個string型別參數的建構函式,函數體空;**建構函式使用這個string對象初始化bookNo,units_sold/revenue使用類內初始值初始化;*/ Sales_item(const std::string &book): bookNo(book), units_sold(0), revenue(0.0) { }/*一個istream為參數的建構函式,函數體空;**函數體:從is中讀取一條交易資訊後存入this對象中;*/ Sales_item(std::istream &is) { is >> *this; }public:/* 重載運算子+=,用於對象之間的累加運算;** 成員二元操作:左側操作必然隱含的this指標*/ Sales_item& operator+=(const Sales_item&); /*常成員函數,表示只能由常成員對象訪問;**對Sales_item對象進行操作,返回bookNo;*/ std::string isbn() const { return bookNo; } double avg_price() const;// 私人成員private://隱式初始化為空白字串 std::string bookNo; //IN_CLASS_INITS:類初始狀態設定;#ifdef IN_CLASS_INITS//顯式初始化; unsigned units_sold = 0; double revenue = 0.0;#else//定義變數; unsigned units_sold; double revenue; #endif};/* 二元謂詞(有兩個參數);**一個可調用的運算式,返回結果是一個能用作條件的值。**用於比較對象.isbn是否相等,相等返回布爾值true,否則false;*/inline bool compareIsbn(const Sales_item &lhs, const Sales_item &rhs) { return lhs.isbn() == rhs.isbn(); }// 非成員二元操作:必須聲明每個運算元的參數;Sales_item operator+(const Sales_item&, const Sales_item&);/* 二元謂詞(有兩個參數);內聯;**一個可調用的運算式,返回結果是一個能用作條件的值。****定義==,用於對象相等;*/inline bool operator==(const Sales_item &lhs, const Sales_item &rhs){ // must be made a friend of Sales_item return lhs.units_sold == rhs.units_sold && lhs.revenue == rhs.revenue && lhs.isbn() == rhs.isbn();}/* 二元謂詞(有兩個參數);內聯;**一個可調用的運算式,返回結果是一個能用作條件的值。**定義!=,用於對象不相等;與==相反;*/inline bool operator!=(const Sales_item &lhs, const Sales_item &rhs){ return !(lhs == rhs); }// 假定兩個對象指的是具有相同的ISBN,重載函數定義+=,用於對象+=;Sales_item& Sales_item::operator+=(const Sales_item& rhs) { units_sold += rhs.units_sold; revenue += rhs.revenue; return *this;}//假定兩個對象指的是具有相同的ISBN,重載函數定義定義+,用於對象+;Sales_item operator+(const Sales_item& lhs, const Sales_item& rhs) { Sales_item ret(lhs); ret += rhs; return ret; }//定義輸入資料流>>,用於對象輸入;std::istream& operator>>(std::istream& in, Sales_item& s){ double price; in >> s.bookNo >> s.units_sold >> price; // check that the inputs succeeded if (in) s.revenue = s.units_sold * price; else s = Sales_item(); // input failed: reset object to default state return in;}//定義輸出資料流<<,用於對象輸出;std::ostream& operator<<(std::ostream& out, const Sales_item& s){ out << s.isbn() << " " << s.units_sold << " " << s.revenue << " " << s.avg_price(); return out;}//定義函數avg_price;double Sales_item::avg_price() const{ if (units_sold) return revenue/units_sold; else return 0;}#endif</strong></span></strong>