C++Primer第五版 7.5.4节练习

来源:互联网 发布:sql 校验身份证号码 编辑:程序博客网 时间:2024/05/25 18:10

练习7.47:说明接受一个string参数的Sales_data构造函数是否应该是explicit的,并解释这样做的优缺点。
答:应该是explicit,这样就不能通过隐式转换将string参数传给构造函数,必须通过显示的初始化,可以保证构造函数的数据成员的安全性,但构造函数的灵活性丧失。

练习7.48:假定Sales_data的构造函数不是explicit的,则下述定义将执行什么样的操作?

string null(“9-999-99999-9”);Sales_data item1(null_isbn);Sales_data item2(“9-999-99999-9”);

如果Sales_data的构造函数是explicit的,又会发生什么呢?
答:如果不是explicit的
string null(“9-999-99999-9”);
Sales_data item1(null_isbn);//正确,直接初始化
Sales_data item2(“9-999-99999-9”);//正确,编译器允许一步类类型转换,先转换为string再转换为Sales_data对象。

如果是explicit的
string null(“9-999-99999-9”);
Sales_data item1(null_isbn);//正确,直接初始化
Sales_data item2(“9-999-99999-9”);//错误,转换受限

练习7.49:对于combine函数的三种不同声明,当我们调用i.combine(s)时分别发生什么情况?其中i是一个Sales_data,而s是一个string对象。

a) Sales_data &combine(Sales_data);(b) Sales_data &combine(Sales_data&);(c) Sales_data &combine(const Sales_data&) const;

答:(a)相当于调用一个临时变量,调用完成后,s的值被丢弃,i.combine()结果保存到combine的返回值中
(b)s的值调用后,发生改变,i.combine()结果给返回值。
(c)s是const Sales_data&的,调用后,s值不发生改变,i.combine()的结果给返回值。

练习7.50:确定你的Person类中是否有一些构造函数应该是explicit的。
答:关于个人姓名,性别,年龄的构造函数应该是explicit的,必须显示初始化,保证这些重要信息,不能通过隐式转换被篡改。

练习7.51:vector将其参数的构造函数定义成explicit的,而string则不是,你觉得原因何在?
答:vector是一个容器,必须指定容器里装的对象类型,如vector<char>是一个新的类型,如果通过char类型转换为vector<char>,则vector的灵活性受到影响,具体来说,vector<char>可以push_back是char的类型,vector各个函数的调用很方便,如果通过类类型转换,反而使得vector的使用受限,string类型不是explicit,string类型可以自然接收不同类类型的转换,支持隐式转换使得跟字符串的处理变得灵活。

1 0
原创粉丝点击