第七章 7.5.4节练习

练习7.47

说明接受一个string参数Sales_data构造函数是否应该是explicit的,并解释这样做的优缺点。

解答:

应该声明成explicit,这样做能让对象构造的更加明确。

缺点可能就是,在构造对象的时候,不注意会出现莫名的错误。


练习7.48

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

string null_isbn("9-999-99999-9");

Sales_data item1(null_isbn);

Sales_data item2("9-999-99999-9");

如果Sales_data的构造函数是explicit的,又会发生什么呢?

解答:

1) 初始化一个Sales_data类对象,使其bookNo为“9-999-99999-9”。

然后,使用编译器生成默认拷贝构造函数来初始化item1.

item2的生成与null_isbn一样。

2) 这里也是显式的使用string参数的构造函数,所以不会出现别的问题。

等价测试:

#include <string>

using namespace std;

class A{
public:
	A() = default;
	explicit A(const string& str) :data(str){}
	string data;
};
int main(){
	A null("9-999-99999-9");
	A item1(null);
	A item2("9-999-9999-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;

解答:

#include <string>

using namespace std;

class A{
public:
	A() = default;
	explicit A(const string& str) :data(str){}

	A &afun(A a){}
	A &bfun(A& a){}
	A &cfun(const A& a)const{}

	string data;
};
int main(){
	string str = "hello";
	A null("9-999-99999-9");
	null.afun(str);
	null.bfun(str);
	null.cfun(str);
}
以上是等价测试用例。

基本上都是一个错误,string类型无法向目标类型进行转换。


练习7.50

确定在你的Person类中是否也有一些构造函数应该是explicit的。

解答:

这个应该也是需要,比如说用名字进行构造之类的。


练习7.51

vector将其单参数的构造函数定义成explicit的,而string则不是,你觉得原因何在?

解答:

应该是为了方便理解,所以添加了这样的设定。

因为vector接受一个容量参数的构造函数如果不是explicit的,那么就允许这样初始化:vector<int> ivec = 10;
意思就是初始化ivec为10个0,这样太让人迷惑了。所以定义成explicit比较好,不允许这样的写法。但是string s = "aaa"还是很好理解的。

引用:http://bbs.csdn.net/topics/390747193?page=1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值