【C++ Primer 第7章】定义抽象数据类型

参考资料

1. 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,且没有返回类型。

默认构造函数:无需任何实参,执行默认初始化。

合成默认构造函数:编译器创建的构造函数


只有当类没有声明任何构造函数时,编译器才会自动隐式地定义一个默认构造函数。

• 如果类包含有内置类型或复合类型的成员,则只有当这些成员全部都被赋予了类的初始值,这个类才适合于使用合成的默认构造函数

posted @ 2018-06-19 19:05  苏格拉底的落泪  阅读(411)  评论(0编辑  收藏  举报