7.44:下面这条声明合法吗?如果不,为什么?
vector<NoDefault> vec(10);
Ans:不合法。由于容器vector是包含10个NoDefault类型的对象集合,每个对象都进行默认初始化,由于NoDefault类没有定义默认构造函数,所以无法对每个对象执行默认初始化,故不合法。
7.45:如果在上一个练习中定义的vector的元素类型是C,则声明合法吗?为什么?
Ans:合法。由于vector的元素类型是C,而类C提供了默认构造函数,可以执行相应的默认初始化,故声明合法。
7.46:下面哪些论断式不正确的?为什么?
(a)一个类必须至少提供一个构造函数。
(b)默认构造函数是参数列表为空的构造函数。
(c)如果对于类来说不存在有意义的默认值,则类不应该提供默认构造函数。
(d)如果类没有定义默认构造函数,则编译器将为其生成一个并把每个数据成员初始化成相应的类型的默认值。
Ans:a)不正确。当类中没有提供构造函数,编译器也会自动为我们提供一个默认的构造函数。
b)不正确。当一个构造函数的参数列表的值都有默认实参,那么也可以作为默认构造函数。
c)不正确。对于类来说即使不存在有意义的默认值,类也应该提供默认构造函数,防止以后定义一个没有任何初始值的对象时,程序出错。
d)不正确。当类定义了带参的构造函数,那么编译器就不会定义默认的构造函数。并且就算定义了默认构造函数,类中的数据成员初始化时执行相应的构造函数,内置类型和复合类型在全局作用域才会被初始化为默认值,否则未定义。