7.5.2节的练习,可以自行选择练习。
练习7.43
假定有一个名为NoDefault的类,它有一个接受int的构造函数,但是没有默认构造函数。定义类C,C有一个NoDefault类型的成员,定义C的默认构造函数。
解答:
struct NoDefault{
NoDefault(const int& i):data(i){}
int data;
};
struct C{
C(int num = 0) :no(num){}
NoDefault no;
};
练习7.44
下面这条声明合法吗?如果不为什么?
vector<NoDefault> vec(10);
解答:
不合法,因为NoDefault没有默认构造函数。
练习7.45
如果在上个练习中定义的vector的元素类型是C,则声明合法吗?为什么?
解答:
这个合法,因为C有默认构造函数。
练习7.46
下面那些论断是不正确的?为什么?
(a) 一个类必须至少提供一个构造函数。
(b) 默认构造函数好似参数列表为空的构造函数。
(c) 如果对已类来说不存在有意义的默认值,则类不应该提供默认构造函数。
(d) 如果类没有定义默认构造函数,则编译器将为其生成一个并把每个数据成员初始化成相应类型的默认值。
解答:
(a) 错。没有提供构造函数的情况下,编译器会为其生成一个。
(b) 错。默认构造函数也可以参数列表。
(c) 错。无论是否有意义,要保证数据使用安全,最好将成员变量都进行初始化。
(d) 正确。