练习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类型可以自然接收不同类类型的转换,支持隐式转换使得跟字符串的处理变得灵活。
最后
以上就是玩命柜子最近收集整理的关于C++Primer第五版 7.5.4节练习的全部内容,更多相关C++Primer第五版内容请搜索靠谱客的其他文章。
发表评论 取消回复