C++Primer第五版 7.5.4节练习

练习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类型可以自然接收不同类类型的转换,支持隐式转换使得跟字符串的处理变得灵活。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值