逻辑操作符的陷阱
Posted chengeputongren
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了逻辑操作符的陷阱相关的知识,希望对你有一定的参考价值。
-
逻辑运算符的原生语义
-
操作数只有两种值(true和false)
-
逻辑表达式不用完全计算就能确定最终值
-
最终结果只能是true或者false
那么,如果我们重载逻辑运算符会发生什么?
例:
1 #include <iostream> 2 #include <string> 3 using namespace std; 4 class Test 5 { 6 int value; 7 public: 8 Test(int _value) 9 { 10 this->value = _value; 11 } 12 ~Test() 13 { 14 } 15 int get_value() 16 { 17 return this->value; 18 } 19 }; 20 //重载逻辑与操作符 21 bool operator && (Test op1,Test op2) 22 { 23 return op1.get_value() && op2.get_value(); 24 } 25 //重载逻辑或操作符 26 bool operator || (Test op1,Test op2) 27 { 28 return op1.get_value() || op2.get_value(); 29 } 30 Test func(Test t) 31 { 32 cout << "Test func(Test t) : Test.value = " << t.get_value() << endl ; 33 34 return t; 35 } 36 int main() 37 { 38 Test t0(0); 39 Test t1(1); 40 #if 0 41 if (func(t0) && func(t1)) 42 { 43 cout << "The result is true" << endl; 44 } 45 else 46 { 47 cout << "The result is false" << endl; 48 } 49 #endif 50 if (operator &&(func(t0),func(t1))) 51 { 52 cout << "The result is true" << endl; 53 } 54 else 55 { 56 cout << "The result is false" << endl; 57 } 58 }
运行结果:
Test func(Test t) : Test.value = 1
Test func(Test t) : Test.value = 0
The result is false
-
问题的本质分析
-
C++通过函数调用扩展操作符的功能
-
进入函数前必须完成所有参数的计算
-
函数参数的计算次序是不定的
-
短路法则完全失效
如果重载逻辑操作符,逻辑操作符重载后无法完全实现原生的语义!!
-
一些建议
-
在实际工程中避免重载逻辑操作符
-
通过重载比较操作符代替逻辑操作符
-
直接使用成员函数代替逻辑操作符重载
-
使用全局函数对逻辑操作符进行重载
-
小结
-
C++从语义上支持逻辑操作符重载
-
重载后的逻辑操作符不满足短路法则
-
工程开发中不要重载逻辑操作符
-
通过重载比较操作符替换逻辑操作符重载
-
通过专用成员函数替换逻辑操作符重载
以上是关于逻辑操作符的陷阱的主要内容,如果未能解决你的问题,请参考以下文章