7.36:下面的初始值是错误的,请找出问题所在并尝试修改它。
struct X {
X(int i ,int j):base(i),rem(base%j) { }
int rem,base;
};
Ans:由于构造函数的初始化顺序与成员定义的顺序一直,所以该程序是rem先初始化,然后才是base,但是初始值列表中rem却使用未初始化的base参与其初始化,所以编译会报错。
修改之后:
struct X {
X(int i ,int j):base(i),rem(base%j) { }
int base,rem;
};
7.37:使用本节提供的Sales_data类,确定初始化下面的变量时分别使用了哪个构造函数,然后罗列出每个对象所有的数据成员的值。
Sales_data first_item(cin);
int main() {
Sales_data next;
Sales_data last("9-999-99999-9");
}
Ans:main函数的第一条语句使用了,默认构造函数,这个对象的数据成员除了bookNo的初始值是空串,其他的都是类内初始值0。
第二条语句使用了接受const &Sales_data的构造函数,这个对象的数据成员除了bookNo的值是"9-999-99999-9",其他的都是类内初始值。
Sales_data first_item(cin);调用了Sales_data(std::istream &is) { read(is,*this); },其对象成员值依赖于用户输入。
Ps:根据实参不同,调用最佳匹配的构造函数。
7.39:如果接受string的构造函数和接受istream&的构造函数都使用默认实参,这种行为合法吗?如果不,为什么?
Ans:不合法。由于两者函数都使用了默认实参,也就意味着两者都具有了默认构造函数的作用,一旦使用不带参数的对象时,会出现调用的二义性。
7.40:从下面的抽象概念中选择一个(或者你自己指定一个),思考这样的类需要哪些数据成员,提供一组合理的构造函数并阐明这样做的额原因。
(a)book (b)Date (c) Employee
(d)Vehicle (e)Object (f)Tree
Ans:可以选择book,一本书需要书名,ISBN号,出版社名,作者名,价格等信息作为数据成员,其中除了价格外其他的都是string类类型的,价格使用double类型的。
class Book { public: Book(const string& bn,const string& no,const string &pb,const string &at,double pc):b_Name(bn),bookNo(no),Publisher(pb),Author(at),price(pc) { } private: string b_Name; string bookNo; string Publisher; string Author; double price=0.0; };