您的位置:首页 > 编程语言 > C语言/C++

C++Primer第五版 7.5.1节练习

2015-09-16 07:21 423 查看
练习7.36:下面的初始值是错误的,请找出问题所在,并尝试修改它

Struct X{
X(int i, int j) : base(i), rem(base%j){}
Int rem,base;
};


答:发生未定义的错误,因为数据成员的顺序先是rem,再到base,因此rem(base%j)这句话,base在rem之后被初始化,因此发生未定义的错误。改法:rem(i%j)

练习7.37:使用本节提供的Sales_data类,确定初始化下面的变量时分别使用了哪个构造函数,然后罗列出每个对象所有数据成员的值。

Sales_data first_item(cin) //调用Sales_data(std::istream &is) 
int main()
{
 Sales_data next;   //调用Sales_data(std::string s = “”)
 Sales_data last(“9-999-99999-9”);//调用  Sales_data(const std::string &s, unsigned n, double p)
}


见云盘程序 练习7.37.cpp

练习7.38:有些情况下我们希望提供cin作为接受istream&参数的构造函数的默认实参,请声明这样的构造函数。

Sales_data(std::istream &is = cin) {}


练习7.39:如果接受string的构造函数和接受istream&的构造函数都使用默认实参,这种行为合法吗?如果不,为什么?

答:不合法,Sales_data test,test的默认函数有两个,因此test不知道调用哪个,产生二义性,不合法。

练习7.40:从下面的抽象概念中选择一个(或者你自己指定一个),思考这样的类需要哪些数据成员,提供一组合理的构造函数并阐明这样做的原因。

(a) Book (b)Date (c)Employee (d)Vehicle (e)Object (f)Tree
(c) class Employee
{   
string EmployeeID;//员工号
string name;//员工姓名
int age;//员工年龄
char sex;//员工性别
string CompanyName;//所属公司

}


练习7.37

/*
*练习7.37
*2015/7/15
*问题描述:练习7.37:使用本节提供的Sales_data类,确定初始化下面的变量时分别使用了哪个构造函数,然后罗列出每个对象所有数据成员的值。
Sales_data first_item(cin) //调用Sales_data(std::istream &is) 
int main()
{
 Sales_data next;   //调用Sales_data(std::string s = "")
 Sales_data last("9-999-99999-9");//调用  Sales_data(const std::string &s, unsigned n, double p)
}

*功能:弄清构造函数 
*作者:Nick Feng 
*邮箱:nickgreen23@163.com 
* 
*/
#include <iostream>
#include <string>

using namespace std;

class Sales_data{
public:
    friend istream &read(istream &, Sales_data &);//一个友元函数read,便于Sales_data类直接访问 
    friend ostream &print(ostream &os, const Sales_data &item);
    //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);
    }

    Sales_data(std::string s = "") : bookNo(s) {}
    //Sales_data(std::istream is ) {}
    //Sales_data(std::istream &is = cin)  {}

    string isbn() const {return bookNo;}
    Sales_data& combine(const Sales_data&);
    double avg_price() const;

private:
    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);
}
*/

Sales_data first_item(cin);
int main()
{
   print(cout,first_item);
    cout << endl;
    Sales_data next;
     print(cout,next);
    cout << endl;
    Sales_data last("9-999-99999-9");
    print(cout,last);
    cout << endl;
    return 0;
 }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: