1 C++中的逻辑操作符重载
1.1 逻辑操作符的原生语义
逻辑操作符的原生语义如下:
- 操作数只有两种值(true和flase)。
- 逻辑表达式不用完全计算就能确定最终值,短路原则。
- 最终结果只能是true或者false。
我们先来看一下逻辑表达式的输出结果:
#include <iostream>
#include <string>
using namespace std;
int func(int i)
{
cout << "int func(int i) : i = " << i << endl;
return i;
}
int main()
{
if( func(0) && func(1) )
{
cout << "Result is true!" << endl;
}
else
{
cout << "Result is false!" << endl;
}
cout << endl;
if( func(0) || func(1) )
{
cout << "Result is true!" << endl;
}
else
{
cout << "Result is false!" << endl;
}
return 0;
}
输出结果如下:

1.2 重载逻辑操作符
我们看一下重载逻辑操作符后其语义会发生什么变化:
#include <iostream>
#include <string>
using namespace std;
class Test
{
int mValue;
public:
Test(int v)
{
mValue = v;
}
int value() const
{
return mValue;
}
};
bool operator && (const Test& l, const Test& r)
{
return l.value() && r.value();
}
bool operator || (const Test& l, const Test& r)
{
return l.value() || r.value();
}
Test& func(Test& i)
{
cout << "Test func(Test i) : i.value() = " << i.value() << endl;
return i;
}
int main()
{
Test t0(0);
Test t1(1);
if( func(t0) && func(t1) )
{
cout << "Result is true!" << endl;
}
else
{
cout << "Result is false!" << endl;
}
cout << endl;
if( func(t0) || func(t1) )
{
cout << "Result is true!" << endl;
}
else
{
cout << "Result is false!" << endl;
}
return 0;
}

从结果我们可以看出短路原则失效了!
问题的本质分析:
- C++通过函数调用扩展操作符的功能。
- 进入函数体前必须完成所有参数的计算。
- 函数参数的计算次序是不定的。
- 短路法则完全失效。
虽然C++从语法上支持逻辑操作符重载,但是逻辑操作符重载后无法完全实现原生的语义,不满足短路法则!
1.3 逻辑操作符重载的建议
如下建议从上往下依次递进,不得已而为之:
- 实际工程中避免重载逻辑操作符。
- 通过重载比较操作符替代逻辑操作符重载(直接和true和false比较)。
- 直接使用成员函数代替逻辑操作符重载。
- 使用全局函数对逻辑操作符进行重载。
参考资料:
1958

被折叠的 条评论
为什么被折叠?



