C++Primer第五版 7.5.1节练习
2015-09-16 07:21
423 查看
练习7.36:下面的初始值是错误的,请找出问题所在,并尝试修改它
答:发生未定义的错误,因为数据成员的顺序先是rem,再到base,因此rem(base%j)这句话,base在rem之后被初始化,因此发生未定义的错误。改法:rem(i%j)
练习7.37:使用本节提供的Sales_data类,确定初始化下面的变量时分别使用了哪个构造函数,然后罗列出每个对象所有数据成员的值。
见云盘程序 练习7.37.cpp
练习7.38:有些情况下我们希望提供cin作为接受istream&参数的构造函数的默认实参,请声明这样的构造函数。
练习7.39:如果接受string的构造函数和接受istream&的构造函数都使用默认实参,这种行为合法吗?如果不,为什么?
答:不合法,Sales_data test,test的默认函数有两个,因此test不知道调用哪个,产生二义性,不合法。
练习7.40:从下面的抽象概念中选择一个(或者你自己指定一个),思考这样的类需要哪些数据成员,提供一组合理的构造函数并阐明这样做的原因。
练习7.37
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; }
相关文章推荐
- C++Primer第五版 7.4.1节练习
- C++Primer第五版 7.4节练习
- C++Primer第五版 7.3.4节练习
- C++Primer第五班 7.3.3节练习
- C++Primer第五版 7.3.2节练习
- C++Primer第五版 7.3.1节练习
- C++Primer第五版 7.2节练习
- C++Primer第五版 7.2.1节练习
- C++Primer第五版 7.1.4节练习
- C++Primer第五版 7.1.3节练习
- C++Primer第五版 7.1.2节练习
- C++Primer第五版 7.1.1节练习
- C++Primer第五版 第6章 函数(练习解答)
- C++Primer第五版 6.7节练习
- C++Primer第五版 6.6节练习
- C++Primer第五版 6.5.3节练习
- C++Primer第五版 6.5.2节练习
- Leetcode Maximal Square
- C语言之赋值操作符和表达式
- C语言中联合体union妙用