zoukankan      html  css  js  c++  java
  • 逻辑操作符的陷阱

    • 逻辑运算符的原生语义
    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. 通过专用成员函数替换逻辑操作符重载
     
     
     
     
     
    主要记录的是学习听课的笔记
  • 相关阅读:
    SAM4E单片机之旅——17、通过UART进行标准IO
    SAM4E单片机之旅——16、NAND Flash读写
    SAM4E单片机之旅——15、触屏输入与SPI通信
    SAM4E单片机之旅——14、LCD之SMC的配置
    SAM4E单片机之旅——13、LCD之ASF初步
    不重复验证码
    [Vue warn]: Missing required prop: "value"
    iview input 禁止输入特殊字符 ,解决中文输入法中input把拼音输入
    iview tree 绑定数据
    vue render 中遇到的问题
  • 原文地址:https://www.cnblogs.com/chengeputongren/p/12235583.html
Copyright © 2011-2022 走看看