练习7.41:使用委托构造函数重新编写你的Sales.data类,给每个构造函数体添加一条语句,令其一旦执行就打印一条信息.用各种可能的方式分别创建Sales_data对象,认真研究每次输出的信息直到你确实理解了委托构造函数的执行顺序位置.
【出题思路】
委托构造函数使用它所属类的其他构造函数执行它自己的初始化过程,或者说它把它自己的一些或全部职责委托给了其他构造函数.程序先执行受委托构造函数,然后才执行委托构造函数本身的语句.
Beginning with C++ 11, it is possible for one constructor to call another constructor in the same class. This is known as constructor delegation.
【解答】
改写后的Sales_data类及其验证程序如下所示:
#include <iostream> #include <string> using namespace std; class Sales_data { friend std::istream &read(std::istream &is, Sales_data &item); friend std::ostream &print(std::ostream &os, const Sales_data &item); public: //委托构造函数 Sales_data (const string &book, unsigned num, double sellp, double salep) :bookNo(book), units_sold(num), sellingprice(sellp), saleprice (salep) { if(sellingprice) discount = saleprice / sellingprice; cout<<"该构造函数接受书号、销售量、原价、实际售价四个信息"<< endl; } Sales_data() : Sales_data("", 0, 0, 0) { cout<<"该构造函数无须接受任何信息" << endl; } Sales_data(const string &book): Sales_data(book, 0, 0, 0) { cout << "该构造函数接受书号信息"<< endl; } Sales_data(std::istream &is) : Sales_data() { read(is, *this); cout<< "该构造函数接受用户输入的信息"<<endl; } private: //书籍编号,隐式初始化为空串 std::string bookNo; //销售量,显式初始化为0 unsigned units_sold = 0; //原始价格,显式初始化为0.0 double sellingprice = 0.0; //实售价格,显式初始化为0.0 double saleprice = 0.0; //折扣,显式初始化为0.0 double discount = 0.0; }; std::istream &read(std::istream &is, Sales_data &item) { is >> item.bookNo >> item.units_sold >> item.sellingprice >> item.saleprice; return is; } std::ostream &print(std::ostream &os, const Sales_data &item) { os<<item.bookNo<<" "<<item.units_sold<<" "<<item.sellingprice << ""<<item.saleprice<<" "<<item.discount; return os; } int main() { Sales_data fist("H978-7-121-15535-2n", 85, 128, 109); Sales_data second; Sales_data third ("978-7-121-15535-2"); Sales_data last(cin); return 0; }
执行上述程序的输出结果是:
该构造函数接受书号、销售量、原价、实际售价四个信息
该构造函数接受书号、销售量、原价、实际售价四个信息
该构造函数无须接受任何信息
该构造函数接受书号、销售量、原价、实际售价四个信息
该构造函数接受书号信息
该构造函数接受书号、销售量、原价、实际售价四个信息
该构造函数无须接受任何信息
a 10 100 85 (此行由用户输入)
该构造函数接受用户输入的信息
本页共74段,3230个字符,4278 Byte(字节)