逻辑操作符的陷阱

  • 逻辑运算符的原生语义
  1. 操作数只有两种值(true和false)
  2. 逻辑表达式不用完全计算就能确定最终值
  3. 最终结果只能是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
  • 问题的本质分析
  1. C++通过函数调用扩展操作符的功能
  2. 进入函数前必须完成所有参数的计算
  3. 函数参数的计算次序是不定的
  4. 短路法则完全失效
如果重载逻辑操作符,逻辑操作符重载后无法完全实现原生的语义!!
  • 一些建议
  1. 在实际工程中避免重载逻辑操作符
  2. 通过重载比较操作符代替逻辑操作符
  3. 直接使用成员函数代替逻辑操作符重载
  4. 使用全局函数对逻辑操作符进行重载
  • 小结
  1. C++从语义上支持逻辑操作符重载
  2. 重载后的逻辑操作符不满足短路法则
  3. 工程开发中不要重载逻辑操作符
  4. 通过重载比较操作符替换逻辑操作符重载
  5. 通过专用成员函数替换逻辑操作符重载
 
 
 
 
 

原文链接: https://www.cnblogs.com/chengeputongren/p/12235583.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    逻辑操作符的陷阱

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/325447

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月1日 下午3:19
下一篇 2023年3月1日 下午3:20

相关推荐