explicit用法,防止对象隐式被转换。
例子一:隐式转换
class
C
{
public :
C ( int j );
int i;
};
C :: C (int j)
{
i = j;
}
int main()
{
C c( 0 );
c = 5 ; // 5被隐式转换
}
{
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 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)
![dot.gif](http://www.cppblog.com/Images/dot.gif)
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)