C++ Primer中Sales_item.h代碼解析__C++

來源:互聯網
上載者:User
<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>


相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.