问题描述
今天在看代码的时候,突然发现代码中有两个有趣的地方,如下所示:
explicit __CLR_OR_THIS_CALL operator bool() const {
return !fail();
}
_NODISCARD bool __CLR_OR_THIS_CALL operator!() const {
return fail();
}
这两个操作符重载,目的是:检查类的对象是否成功初始化。
在函数中的调用如下:
fstream bitstreamFile(m_bitstreamFileName.c_str(), fstream::binary | fstream::out);
if (!bitstreamFile)
if(class) 和 if(!class)操作
if(class)操作
实际上是包含了一次隐示类型转换,需要有class->bool的类型转换符。
所以在定义时需要在类中重载 类型转换 ,如下:
class test{
operator bool(){
return true;
}
}
if(!class)操作
如果class进行了!操作符重载,那么就调用这个函数。
如果class没有进行!操作符重载,但是有class->bool类型转换的重载,也是可以正常实现功能。
如果要用!操作符重载,如下:
class test{
bool operator!(){
return true;
}
}
自定义类的隐示类型转换
有了以上的讨论,明白如何自己定义类型转换,从而实现不同类之间的运算符计算。
如下:
class test{
operator int(){
return 3;
}
operator double(){
return 3.0;
}
}
void main(){
test dj;
int x = 5 + dj;
double y = 5.0 + dj;
}