C++中有特殊的两个操作符可以重载,分别是void* 和 !
先上代码:
class A
{
public:
};
int main()
{
A a;
if(a)
cout<<"c";
system("PAUSE");
}
这种情况下,编译不通过,提示不能将对象a直接转化为bool型。
改进(1):
class A
{
public:
operator void*()
{
cout<<"a";
return (void*)0;
}
};
int main()
{
A a;
if(a)
cout<<"c";
system("PAUSE");
}
这种情况下输出为 a。
分析:a在不能直接转换为bool型的情况下,会试图先进行 (void*)a 操作,这个操作会直接调用成员函数operator void*(),这个函数返回一个void*返回值,所以这里的if(a)实际上是if((void*)a),并根据强制转换函数的结果进行if判断,如果上述函数改为return (void*)this, 那么就可以看到代码输出 ac.
改进(2):
class A
{
public:
operator void*()
{
cout<<"a";
return (void*)0;
}
};
int main()
{
A a;
if(a)
cout<<"c";
if(!a)
cout<<"d";
system("PAUSE");
}
代码输出:aad
分析:当执行到if(!a)时,对于 !a,同样是由于a无法直接转化为bool型,所以 !a就等同于 !((void*)a),由于上述(void*)a重载函数中返回0,所以if(!a)为真。
改进(3):
class A
{
public:
operator void*()
{
cout<<"a";
return (void*)0;
}
bool operator !()
{
cout<<"b";
return true;
}
};
int main()
{
A a;
if(a)
cout<<"c";
if(!a)
cout<<"d";
system("PAUSE");
}
代码输出:abd
分析:由于重载了操作符!,所以 !a 不再是进行a是否能转化为bool型的判断,直接执行了operator !()函数,上述函数返回true,所以if(!a)为真。
总结:一个对象a,对于!a操作,如果对象重载了!操作符,则执行重载操作函数,否则先判断是否重载了强制转换操作符(void*),并执行强制转换操作符,否则判断是否能直接转换为bool类型。