第七章 7.5.1节练习

练习7.36

下面的初始值是错误的,请找出问题所在并尝试修改它。

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

解答:

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

练习7.37
使用本节提供的Sales_data类,确定初始化下面的变量时分别使用了哪个构造函数,然后罗列出所有数据成员的值。
Sales_data first_item(cin);
int mian(){
  Sales_data next;
  Sales_data last("9-999-99999-9");
}
解答:
对260页的程序,构造函数一共有三个。
Sales_data first_item(cin); 使用的是第三个构造函数,其中数据成员的值是从标准输入中读出来的。
Sales_data next; 使用的第一个构造函数,这里bookNo为空,其他值都为默认值。
Sales_data last("9-999-99999-9"); 使用的也是第一个构造函数,其中bookNo为“9-999-99999-9”,其他成员为默认值。

练习7.38
有些情况下我们希望提供cin作为接收istream&参数的构造函数的默认实参,请声明这样的构造函数。
解答:
struct A{
   A(std::istream& in = cin){...}
};

练习7.39
如果接收string的构造函数和接收istream&的构造函数都使用默认实参,这种行为合法吗?如果不,为什么?
解答:
这样做是合法的。在编译的时候,编译器可能会给出类中还有多个构造函数的警告。
不过,需要在创建对象的时候,对默认构造函数传参,以便类知道用哪个构造函数去初始化这个类。
否则,会出现编译错误,类无法确定使用哪个构造函数去构造这个类对象。

练习7.40
从下面的抽象概念中选择一个(或者你自己指定一个),思考这样的类需要哪些成员,提供一组合理的构造函数并阐明这样做的原因。
(a) Book
(b) Date
(c) Employee
(d) Vehicle
(e) Object
(f) Tree
解答:
class Book{
public:
   Book() = default;
   Book(istream& in = cin){read(in, *this);
   Book(string bname, string aname, string no, string date, size_t p):
       book_name(bname), author_name(author_name), bookNo(no), Date(date), pages(p){}
   string book_name = "";
   string author_name = "";
   string bookNo = "";
   string Date = "";
   size_t pages =1;
};

这就是面向对象编程。需要考虑一个对象真实含有什么,这里我只是举一个例子。

其中构造函数有从流中读取数据的,也有直接传参的,还有默认的。或许这可以代表一本书不同的时期,拥有不同的成员数据吧。

剧透一下,这题会被后面章节用到,所以认真的做一下很有必要。



©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页