练习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;
}