码迷,mamicode.com
首页 > 其他好文 > 详细

逻辑操作符的陷阱

时间:2020-01-27 12:27:42      阅读:78      评论:0      收藏:0      [点我收藏+]

标签:函数参数   调用   space   his   font   style   mes   name   stream   

  • 逻辑运算符的原生语义
  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. 通过专用成员函数替换逻辑操作符重载
 
 
 
 
 

逻辑操作符的陷阱

标签:函数参数   调用   space   his   font   style   mes   name   stream   

原文地址:https://www.cnblogs.com/chengeputongren/p/12235583.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!