用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 }
之后会陆续放出阅读章节中感兴趣的代码,并附上自己的体会和建议,当然,如有差错,还希望大家及时斧正。