先看看什么情况下是隐式类型转换:
可以为转换显示地使用构造函数:
#include<iostream>
#include <string>
#include <vector>
using namespace std;
class Conversion{
public:
Conversion(string s)
{
sdata = s;
idata = 0;
}
Conversion & combine(const Conversion& oldC){
sdata = sdata + oldC.getSdata();
cout << sdata << endl;
return *this;
}
const string getSdata() const { return sdata; }
private:
string sdata;
int idata;
};
int main()
{
string str = "abc";
Conversion test("def");
test.combine(str);<span style="font-family: Arial, Helvetica, sans-serif;">//本来应该接受Conversion类型的参数,但是string类型的参数也可以</span>
return 0;
}
编译器只会自动执行一步类型转换,下面这种写法就是错误的:
test.combine("abc");
第一步,将"abc"转换成string
第二部,将string转为Conversion
可以显示的将字符串转换为string:
test.combine(string("abc"));
explicit Conversion(string s)
{
sdata = s;
idata = 0;
}
这样,隐式转换的那句无法通过编译。
关键字explicit只对一个实参的构造函数有效。需要多个实参的构造函数不能用于执行隐式转换,所以无需将这些构造函数指定为explicit的。
注意:explicit构造函数只能用于直接初始化,不能用于拷贝形式的初始化。
Conversion test2 = string("abc"); //错误,不能将explicit构造函数用于拷贝形式的初始化过程
Conversion test1(string("abc")); //正确,直接初始化
可以为转换显示地使用构造函数:
test.combine(Conversion("abc")); //使用构造函数显示地强制转换
标准库中含有显式构造函数的类:
接受一个单参数的const char*的string构造函数不是explicit的。
接受一个容量参数的vector构造函数是explicit的。