《C++ primer》第一章代碼 Sales_item.h


  用C++寫代碼的總感覺還有許多地方沒理解透,用起來很心虛,所以又找了一本《C++ Primer》來讀,並記錄下學習心得和體會,希望能與大家共勉。

  在第一章里需要用到一個叫Sales_item.h的頭文件,但是打開書上所說的網址根本找不到,后來在度娘的幫助下找到了這份代碼,故分享給大家。

 1 #ifndef SALESITEM_H
 2 #define SALESITEM_H
 3 #include <iostream>
 4 #include <string>
 5 
 6 class Sales_item{
 7 public:
 8     Sales_item(const std::string &book):isbn(book),units_sold(0),revenue(0.0){}
 9     Sales_item(std::istream &is){ is >> *this;}
10     friend std::istream& operator>>(std::istream &,Sales_item &);
11     friend std::ostream& operator<<(std::ostream &,const Sales_item &);
12 public:
13     Sales_item & operator+=(const Sales_item&);  
14 public:
15     double avg_price() const;
16     bool same_isbn(const Sales_item &rhs)const{
17     return isbn == rhs.isbn;
18     }
19     Sales_item():units_sold(0),revenue(0.0){}
20 public:
21     std::string isbn;
22     unsigned units_sold;
23     double revenue;
24 };
25 
26 using std::istream;
27 using std::ostream;
28 Sales_item operator+(const Sales_item &,const Sales_item &);
29 
30 inline bool operator==(const Sales_item &lhs,const Sales_item &rhs){
31     return lhs.units_sold == rhs.units_sold && lhs.revenue == rhs.revenue && lhs.same_isbn(rhs);  
32 }
33 
34 inline bool operator!=(const Sales_item &lhs,const Sales_item &rhs){
35     return !(lhs == rhs);
36 }
37 
38 inline Sales_item & Sales_item::operator +=(const Sales_item &rhs){
39     units_sold += rhs.units_sold;
40     revenue += rhs.revenue;
41     return *this;
42 }
43 
44 inline Sales_item operator+(const Sales_item &lhs,const Sales_item &rhs){
45     Sales_item ret(lhs);
46     ret += rhs;
47     return ret;
48 }
49 
50 inline istream& operator>>(istream &in,Sales_item &s){
51     double price;
52     in >> s.isbn >> s.units_sold >> price;
53     if(in)
54         s.revenue = s.units_sold * price;
55     else
56         s = Sales_item();
57     return in;
58 }
59 
60 inline ostream& operator<<(ostream &out,const Sales_item &s){
61     out << s.isbn << "\t" <<s.units_sold << "\t" << s.revenue << "\t" << s.avg_price();
62     return out;
63 }
64 
65 inline double Sales_item::avg_price() const{
66     if(units_sold)
67         return revenue/units_sold;
68     else
69         return 0;
70 }
71 #endif

  說實話,這份頭文件可不簡單,看起來有點費力,不過幸好還有點功力,代碼還是能看懂。第一章就放這么復雜的代碼,真是讓人頭疼。不過作者也許是想讓讀者先領略一下C++的風采和神奇特效,所以才構造一個復雜的類,有構造函數,有友元,有操作符重載,有內聯函數,巴拉巴拉,這C++的一大塊內容都給包含進去了。

  之前讀了一會《C++沉思錄》,對於類有了更深層次的理解,不過那本書似乎並不適合現在閱讀,有些東西並不是現在能領悟得了的,還是等到時機成熟再來看會更好一點。畢竟書不在多,在於精嘛。

  考慮到部分人連簡單的代碼也懶得動手寫,順便把源文件代碼也傳上來。這是習題1.21的源碼。我用的是第四版,其它版本也許有些差異,僅供參考。

 1 #include <iostream>
 2 #include "Sales_item.h"
 3 using namespace std;
 4 
 5 int main(int argc, char const *argv[])
 6 {
 7     Sales_item book;
 8     cout << "Enter transactions:" << endl;
 9     while(cin >> book){
10         cout << "ISBN          sold   price   revenue" << endl;
11         cout << book << endl;
12     }
13     return 0;
14 }

  之后會陸續放出閱讀章節中感興趣的代碼,並附上自己的體會和建議,當然,如有差錯,還希望大家及時斧正。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM