C++Primer第五版 7.1.4节练习

来源:互联网 发布:手机打网络电话软件 编辑:程序博客网 时间:2024/06/07 18:22

练习7.11:在你的Sales_data类中添加构造函数,然后编写一段程序令其用到每个构造函数。
练习7.12:把只接受一个istream作为参数的构造函数定义到类的内部。
练习7.13:使用istream构造函数重写第229页的程序。
练习7.14:编写一个构造函数,令其用我们提供的类内初始值显示地初始化成员。
练习7.15:为你的Person类添加正确的构造函数。

答:练习7.11-练习7.15见云盘程序练习7.11-练习7.15
练习7.11

/**练习7.11 *日期:2015/7/6 *问题描述:练习7.11:在你的Sales_data类中添加构造函数,然后编写一段程序令其用到每个构造函数。*功能;构造函数的练习 *作者:Nick Feng *邮箱:nickgreen23@163.com */#include <iostream>#include <string>using namespace std;struct Sales_data{    Sales_data() = default;//默认构造函数     Sales_data(const std::string &s) : bookNo(s){ }    Sales_data(const std::string &s, unsigned n, double p) : bookNo(s), units_sold(n), revenue(p*n){ }    Sales_data(std::istream &);    string isbn() const {return bookNo;}    Sales_data& combine(const Sales_data&);    double avg_price() const;    string bookNo;    unsigned units_sold = 0;    double revenue = 0.0;};Sales_data add(const Sales_data&, const Sales_data&);std::ostream &print(std::ostream&, const Sales_data&);std::istream &read(std::istream&, Sales_data&);double Sales_data::avg_price() const{    if (units_sold)        return revenue/units_sold;    else         return 0;}Sales_data& Sales_data::combine(const Sales_data &rhs){    units_sold += rhs.units_sold;    revenue += rhs.revenue;    return *this;}istream &read(istream &is, Sales_data &item){    double price = 0;    is >> item.bookNo >> item.units_sold >> price;    item.revenue = price * item.units_sold;    return is; }ostream &print(ostream &os, const Sales_data &item){    os << item.isbn() << " " << item.units_sold << " "       << item.revenue << " " << item.avg_price();    return os;}Sales_data add(const Sales_data &lhs, const Sales_data &rhs){    Sales_data sum = lhs;    sum.combine(rhs);    return sum;}Sales_data::Sales_data(std::istream &is){    read(is,*this);}int main(){    Sales_data s1("Hero!I am");//调用第一种构造函数     print(cout, s1);    cout << endl;    Sales_data s2("Hero!I am",10,20);//调用第二种构造函数     print(cout,s2);    cout << endl;    Sales_data s3(cin);//调用第三种构造函数     print(cout,s3);    cout << endl;    return 0;}

练习7.12

/**练习7.12 *日期:2015/7/6 *问题描述:练习7.12:把只接受一个istream作为参数的构造函数定义到类的内部。*功能;把read移到内部,要用到友元函数 *作者:Nick Feng *邮箱:nickgreen23@163.com */#include <iostream>#include <string>using namespace std;struct Sales_data{    friend istream &read(istream &, Sales_data &);//一个友元函数read,便于Sales_data类直接访问     Sales_data() = default;//默认构造函数     Sales_data(const std::string &s) : bookNo(s){ }    Sales_data(const std::string &s, unsigned n, double p) : bookNo(s), units_sold(n), revenue(p*n){ }    Sales_data(std::istream &is){        read(is,*this);    }    string isbn() const {return bookNo;}    Sales_data& combine(const Sales_data&);    double avg_price() const;    string bookNo;    unsigned units_sold = 0;    double revenue = 0.0;};Sales_data add(const Sales_data&, const Sales_data&);std::ostream &print(std::ostream&, const Sales_data&);std::istream &read(std::istream&, Sales_data&);double Sales_data::avg_price() const{    if (units_sold)        return revenue/units_sold;    else         return 0;}Sales_data& Sales_data::combine(const Sales_data &rhs){    units_sold += rhs.units_sold;    revenue += rhs.revenue;    return *this;}istream &read(istream &is, Sales_data &item){    double price = 0;    is >> item.bookNo >> item.units_sold >> price;    item.revenue = price * item.units_sold;    return is; }ostream &print(ostream &os, const Sales_data &item){    os << item.isbn() << " " << item.units_sold << " "       << item.revenue << " " << item.avg_price();    return os;}Sales_data add(const Sales_data &lhs, const Sales_data &rhs){    Sales_data sum = lhs;    sum.combine(rhs);    return sum;}/* Sales_data::Sales_data(std::istream &is){    read(is,*this);}*/int main(){    Sales_data s1("Hero!I am");//调用第一种构造函数     print(cout, s1);    cout << endl;    Sales_data s2("Hero!I am",10,20);//调用第二种构造函数     print(cout,s2);    cout << endl;    Sales_data s3(cin);//调用第三种构造函数     print(cout,s3);    cout << endl;    return 0;}

练习7.13

/**练习7.13*日期:2015/7/6 *问题描述:练习7.13:使用istream构造函数重写第229页的程序。*功能;改造main函数 ,说明只在total地方用了构造函数,下面的没有变 *作者:Nick Feng *邮箱:nickgreen23@163.com */#include <iostream>#include <string>using namespace std;struct Sales_data{    friend istream &read(istream &, Sales_data &);//一个友元函数read,便于Sales_data类直接访问     Sales_data() = default;//默认构造函数     Sales_data(const std::string &s) : bookNo(s){ }    Sales_data(const std::string &s, unsigned n, double p) : bookNo(s), units_sold(n), revenue(p*n){ }    Sales_data(std::istream &is){    read(is,*this);    }    string isbn() const {return bookNo;}    Sales_data& combine(const Sales_data&);    double avg_price() const;    string bookNo;    unsigned units_sold = 0;    double revenue = 0.0;};Sales_data add(const Sales_data&, const Sales_data&);std::ostream &print(std::ostream&, const Sales_data&);std::istream &read(std::istream&, Sales_data&);double Sales_data::avg_price() const{    if (units_sold)        return revenue/units_sold;    else         return 0;}Sales_data& Sales_data::combine(const Sales_data &rhs){    units_sold += rhs.units_sold;    revenue += rhs.revenue;    return *this;}istream &read(istream &is, Sales_data &item){    double price = 0;    is >> item.bookNo >> item.units_sold >> price;    item.revenue = price * item.units_sold;    return is; }ostream &print(ostream &os, const Sales_data &item){    os << item.isbn() << " " << item.units_sold << " "       << item.revenue << " " << item.avg_price();    return os;}Sales_data add(const Sales_data &lhs, const Sales_data &rhs){    Sales_data sum = lhs;    sum.combine(rhs);    return sum;}/* Sales_data::Sales_data(std::istream &is){    read(is,*this);}*/int main(){    Sales_data total(cin);//这里用了新的构造函数     if (total.units_sold) //这里作了改动     {        Sales_data trans; //这边若使用新的构造函数,就不会出现统计的效果         while(read(cin,trans))        {            if(total.isbn()==trans.isbn())                total.combine(trans);            else                {                    print(cout, total) << endl;                    total =  trans;                }        }        print(cout, total) << endl;    }else{        cerr << "No data?!" << endl;    }    return 0;}

练习7.14

/**练习7.14*日期:2015/7/6 *问题描述:练习7.14:编写一个构造函数,令其用我们提供的类内初始值显示地初始化成员。*功能;其实之前已经写了 *作者:Nick Feng *邮箱:nickgreen23@163.com */#include <iostream>#include <string>using namespace std;struct Sales_data{    friend istream &read(istream &, Sales_data &);//一个友元函数read,便于Sales_data类直接访问     Sales_data() = default;//默认构造函数     Sales_data(const std::string &s) : bookNo(s){ }    Sales_data(const std::string &s, unsigned n, double p) //: bookNo(s), units_sold(n), revenue(p*n){ } //其实这里已经显示初始化了     {        bookNo = s;        units_sold = n;//显示的初始化,效果与列表的等价         revenue = p*n;    }    Sales_data(std::istream &is){    read(is,*this);    }    string isbn() const {return bookNo;}    Sales_data& combine(const Sales_data&);    double avg_price() const;    string bookNo;    unsigned units_sold = 0;    double revenue = 0.0;};Sales_data add(const Sales_data&, const Sales_data&);std::ostream &print(std::ostream&, const Sales_data&);std::istream &read(std::istream&, Sales_data&);double Sales_data::avg_price() const{    if (units_sold)        return revenue/units_sold;    else         return 0;}Sales_data& Sales_data::combine(const Sales_data &rhs){    units_sold += rhs.units_sold;    revenue += rhs.revenue;    return *this;}istream &read(istream &is, Sales_data &item){    double price = 0;    is >> item.bookNo >> item.units_sold >> price;    item.revenue = price * item.units_sold;    return is; }ostream &print(ostream &os, const Sales_data &item){    os << item.isbn() << " " << item.units_sold << " "       << item.revenue << " " << item.avg_price();    return os;}Sales_data add(const Sales_data &lhs, const Sales_data &rhs){    Sales_data sum = lhs;    sum.combine(rhs);    return sum;}/* Sales_data::Sales_data(std::istream &is){    read(is,*this);}*/int main(){    Sales_data total(cin);//这里用了新的构造函数     if (total.units_sold) //这里作了改动     {        Sales_data trans; //这边若使用新的构造函数,就不会出现统计的效果         while(read(cin,trans))        {            if(total.isbn()==trans.isbn())                total.combine(trans);            else                {                    print(cout, total) << endl;                    total =  trans;                }        }        print(cout, total) << endl;    }else{        cerr << "No data?!" << endl;    }    return 0;}

练习7.15

/**练习7.15*日期:2015/7/6*问题描述:练习7.15:为你的Person类添加正确的构造函数。*功能;写一个自己的Person类,逐步完善 *作者:Nick Feng *邮箱:nickgreen23@163.com */#include <iostream>#include <string>using namespace std;struct Person{    Person()=default;    Person(string  na, string ad) : name(na),address(ad){}    string getName() const {return name;}    string getAddress() const{return address;}    string name;    string address;}; istream& read(istream &is, Person &p){    is >> p.name >> p.address;    return is;}ostream& print(ostream &out,const Person &p){    out << "Name: " << p.name << "\n" << "Address: " << p.address;    return out;} int main(){    Person p1("Nick","Nanjing");    print(cout,p1) << endl;    Person p2;    read(cin,p2);    print(cout,p2) << endl;     return 0;}
0 0