explicit用法,防止对象隐式被转换。
例子一:隐式转换
class C
{
public:
C ( int j );
int i;
};
C::C (int j)
{
i = j;
}
int main()
{
C c(0);
c = 5; //5被隐式转换
}
c = 5 相当于
C temp(5);// 实例化一个临时对象,
c = temp; // 用 = 赋值
temp.C::~C(); // temp 的析构函数被激活
如果类内的成员是一个指针,这种隐式转换是很危险的。为了防止这种隐式转换,我们把 C ( int j ); 改写为explicit C ( int j );即可。
这下编译的时候,会不允许这种隐式的转换,出现如下提示:
Compiling
test.cpp
D:\DATUM\DATUM\PROJECT\Test_muable\test.cpp(14) : error C2679: binary '=' : no operator defined which takes a right-hand operand of type 'const int' (or there is no acceptable conversion)
Error executing cl.exe.
Test_muable.exe - 1 error(s), 0 warning(s)