C++Primer第五版 第七章习题答案(41~50)

来源:互联网 发布:网络信息发布十不准 编辑:程序博客网 时间:2024/06/04 18:40

41、42知识点1:委托构造函数:一个委托构造函数使用它所属类的其他构造函数执行它自己的初始化过程。

class OH{OH(string s, int a, int b):book(s),price(a),sale(b){} //三参数构造函数的参数列表和函数体首先被执行OH():OH("",0,0);//默认构造函数又委托给了三参数构造函数OH (istream& is):OH(){}//OH (istream& is)是一个委托构造函数,它委托给了默认构造函数OH()string book;int price;int sale;};

知识点2:当构造函数委托给另一个构造函数时,受委托的构造函数的初始值列表及其函数体先被执行,接着才会执行到委托函数的函数体。

class OH{OH(string s, int a, int b):book(s),price(a),sale(b){cout<<"OH(string s, int a, int b)"<<endl;} //三参数构造函数的参数列表和函数体首先被执行OH():OH(" ",0,0);//默认构造函数又委托给了三参数构造函数OH (istream& is):OH(){cout<<"OH (istream& is)"<<endl;}//OH (istream& is)是一个委托构造函数,它委托给了默认构造函数OH()string book;int price;int sale;};

PS:41、42知识点为C++11特性

43:知识点1:默认构造函数在很多情况下也是非常重要的。

1:当类的作用域内不需要使用任何初始值定义非静态变量时
2:当类中含有需要使用默认构造函数当作被委托构造函数时
3:类的成员没有在构造函数初始值列表中显示初始化时
知识点2:当类中定义了其它类型的构造函数时,最好提供一个默认的构造函数,养成良好的习惯。
知识点3:类声明对象是不需要加括号!加括号是声明函数的。

OH oh();//不合法的实例化OH oh;//合法

44:因为没有显示初始化,此时向量中的十个元素都需要默认初始化,但是类NoDefault没有默认的构造函数,所以错误。

45:合法,C已经定义了默认的构造函数

46:

(a):错误,类本身不提供构造函数时,编译器会自动合成一个默认构造函数
(b):错误,为成员提供默认值的构造函数也成为默认构造函数
(c):错误,见43题知识点1
(d):错误,当类没有定义构造函数时,才会默认编译器生成默认构造函数。

47:知识点1:如果构造函数只接受一个实参,则它实际上定义了转换为此类类型的隐式转换机制。此构造函数被称为转换构造函数

知识点2:通过一个实参调用的构造函数定义了一条从构造函数的参数类型向类类型隐式转换的机制
知识点3:可以将构造函数声明为explicit加以限定该类型转换

优缺点:这样的隐式类型转换只能作用于单参数的构造函数,但是相较于两步的显示转换,这样的隐式转换则会省去很多麻烦

48:都不会有任何问题,如若没有Salesdata在前,则结果会不一样。

因为皆显示地声明了属于Salesdata类

49:

(a)合法
(b)不合法,Salesdata&类型与Salesdata类型之间不可转换
(c)不合法,const不对,因为combine本身是需要改变传入参数的

50:只需要对单参数的构造函数使用explicit即可。

0 0
原创粉丝点击