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