练习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