【C++ Primer 第7章】定义抽象数据类型
参考资料
Sales_data类
Sales_data.h
1 #include<iostream> 2 #include<string> 3 4 class Sales_data 5 { 6 friend std::istream& operator >> (std::istream&, Sales_data&); 7 friend std::ostream& operator << (std::ostream&, Sales_data&); 8 friend Sales_data operator + (const Sales_data&, const Sales_data&); 9 friend bool operator == (const Sales_data&, const Sales_data&) 10 public: 11 Sales_data() = default; 12 Sales_data(std::string s): bookNo(s), units_sold(0), revenue(0.0) {} 13 Sales_data(std::string s, unsigned n, double p): bookNo(s), units_sold(n), revenue(p) {} 14 public: 15 string isbn() const { return bookNo; } 16 Sales_data& operator += (const Sales_data&); 17 private: 18 string bookNo; //书籍编号 19 double units_sold = 0; //销售量 20 double sellingprice = 0.0; //原始价格 21 double salesprice = 0.0; //实售价格 22 double discount = 0.0; //折扣量 23 };
Sales_data.cpp
1 #include"Sales_data.h" 2 #include<iostream> 3 #include<string> 4 5 bool Sales_data::operator == (const Sales_data &lhs, const Sales_data &rhs) 6 { 7 return lhs.units_sold == rhs.units_sold && 8 lhs.sellprice == rhs.sellprice && 9 lhs.salesprice == rhs.salesprice && 10 lhs.isbn() == rhs.isbn(); 11 } 12 13 Sales_data Sales_data::operator + (const Sales_data &lhs, const Sales_data &rhs) 14 { 15 Sales_data ret(lhs); 16 ret += rhs; 17 return ret; 18 } 19 20 Sales_data& Sales_data::operator += (const Sales_data &rhs) 21 { 22 units_sold += rhs.units_sold; 23 salesprice = (units_sold * salesprice + rhs.units_sold * rhs.salesprice) 24 / (units_sold + rhs.units_sold); 25 if(sellprice != 0) 26 discount = salesprice / sellprice; 27 return *this; 28 } 29 30 istream& Sales_data::operator >> (std::istream &in, Sales_data &s) 31 { 32 in >> s.bookNo >> s.sellprice >> s.salesprice; 33 if(in && s.sellingprice != 0) 34 s.discount = s.salesprice / s.sellprice; 35 else 36 s = Sales_data(); 37 } 38 39 ostream& Sales_data::operator << (std::ostream &os, const Sales_data &s) 40 { 41 os << s.isbn() << " " << s.units_sold << " " << s.sellprice << " " 42 << s.salesprice << " " << s.discount; 43 return os; 44 }
构造函数
功能:初始化类对象的数据成员。无论何时只要类的对象被创建,就会执行构造函数。
特点:构造函数的名字和类的名字相同。类可以包含有多个构造函数(类似重载函数)。不同于其他成员函数,构造函数不能被声明为const,且没有返回类型。
默认构造函数:无需任何实参,执行默认初始化。
合成默认构造函数:编译器创建的构造函数
• 只有当类没有声明任何构造函数时,编译器才会自动隐式地定义一个默认构造函数。
• 如果类包含有内置类型或复合类型的成员,则只有当这些成员全部都被赋予了类的初始值,这个类才适合于使用合成的默认构造函数。