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

 

 posted on 2018-08-21 18:49  linlh  阅读(157)  评论(0编辑  收藏  举报