转换构造函数:参数满足如下条件时的构造函数为转换构造函数:
1.有且仅有一个参数
2.参数是基本类型
3.参数是其他类型
下面看下如下的代码:
#include <iostream>
#include <string>
using namespace std;
class Test
{
int mValue;
public:
Test()
{
mValue = 0;
}
Test(int i)
{
mValue = i;
}
Test operator + (const Test& p)
{
Test ret(mValue + p.mValue);
return ret;
}
int value()
{
return mValue;
}
};
int main()
{
Test t;
t = 5; // 1。会编译过吗发生了什么
Test r;
r = t + 10; // / 2。会编译过吗发生了什么
cout << r.value() << endl;
return 0;
}
通过运行发现:
t = 5; // 1。会编译过吗发生了什么 编译通过,发生了隐式类型转换 调用了 Test(int i) 这个构造函数
实际等价于 t = Test(5)
r = t + 10; // / 2。会编译过吗发生了什么 编译通过 ,发生了隐式类型转换 调用了 Test(int i) 这个构造函数 然后调用Test operator + (const Test& p) 这个操作符重载函数 实际上等价于 t = t + Test(10)
上面隐式类型转换很隐蔽,很容易引入bug 怎样避免编译器自己进行不必要的隐式类型转换了
通过 explicit 关键字 杜绝编译器的转换尝试,只能让其进行显示转换;
转换方式如下:
static_cast<ClassName> (value)
ClassName(value);
(ClassName) value ;// 不推荐方式