• C++中逻辑操作符的重载分析


    1,逻辑运算符的原生语义:

        1,操作数只有两种值(true 和 false);

           1,C 语言中只有非 0 和 0;

        2,逻辑表达式不用完全计算就能确定最终值;

           1,短路规则;

        3,最终结果只能是 true 或者 false;

       

    2,逻辑表达式编程实验:

        1,main.cpp 文件:

     1 #include <iostream>
     2 #include <string>
     3 
     4 using namespace std;
     5 
     6 int func(int i)
     7 {
     8     cout << "int func(int i) : i = " << i << endl;
     9     
    10     return i;
    11 }
    12 
    13 int main()
    14 {
    15     if( func(0) && func(1) )  // func(1) 不会被调用;
    16     {
    17         cout << "Result is true!" << endl;
    18     }
    19     else
    20     {
    21         cout << "Result is false!" << endl;
    22     }
    23     
    24     cout << endl;
    25     
    26     if( func(0) || func(1) )  // func(0) 和 func(1) 都被调用;
    27     {
    28         cout << "Result is true!" << endl;
    29     }
    30     else
    31     {
    32         cout << "Result is false!" << endl;
    33     }
    34     
    35     return 0;
    36 }

       

    3,逻辑操作符可以重载吗?重载逻辑操作符有什么意义?

        1,可以重载;

       

    4,重载逻辑操作符编程实验:

        1,main.cpp 文件:

     1 #include <iostream>
     2 #include <string>
     3 
     4 using namespace std;
     5 
     6 class Test
     7 {
     8     int mValue;
     9 public:
    10     Test(int v)
    11     {
    12         mValue = v;
    13     }
    14     int value() const
    15     {
    16         return mValue;
    17     }
    18 };
    19 
    20 /* 逻辑操作符必须返回 bool 类型 */
    21 bool operator && (const Test& l, const Test& r)
    22 {
    23     return l.value() && r.value();
    24 }
    25 
    26 bool operator || (const Test& l, const Test& r)
    27 {
    28     return l.value() || r.value();
    29 }
    30 
    31 Test func(Test i)
    32 {
    33     cout << "Test func(Test i) : i.value() = " << i.value() << endl;
    34     
    35     return i;
    36 }
    37 
    38 int main()
    39 {
    40     Test t0(0);
    41     Test t1(1);
    42     
    43     if( func(t0) && func(t1) ) // ==> operator && (func(t0), func(t1))
    44     {
    45         cout << "Result is true!" << endl;
    46     }
    47     else
    48     {
    49         cout << "Result is false!" << endl;
    50     }
    51     
    52     cout << endl;
    53     
    54     if( func(1) || func(0) )  // ==> operator || (func(0), func(1))
    55     {
    56         cout << "Result is true!" << endl;
    57     }
    58     else
    59     {
    60         cout << "Result is false!" << endl;
    61     }
    62     
    63     return 0;
    64 }

     2,输出结果:

    1 Test func(Test i) : i.value() = 1
    2 Test func(Test i) : i.value() = 0
    3 Result is false!
    4 
    5 Test func(Test i) : i.value() = 0
    6 Test func(Test i) : i.value() = 1
    7 Result is true!

        3,重载的逻辑操作符都是从左向右调用操作数,短路规则不再适用;

     

    5,重载逻辑操作符:

        1,问题的分析:

           1,C++ 通过函数调用扩展操作符的功能;

               1,调用重载函数需要将两个操作数传递给函数进行调用,这就是问题的本质;

           2,进入函数体前必须完成所有函数参数的计算;

           3,函数参数的计算次序是不定的;

           4,短路法则完全失效;

        2,逻辑操作符重载后无法完全实现原生的语义;

           1,无法通过函数调用满足短路规则;

        3,一些有用的建议:

           1,实际工程开发中避免重载逻辑操作符;

           2,通过重载比较操作符代替逻辑操作符重载;

               1,将一个对象与 true 或 false 比较,来重载;

           3,直接使用成员函数代替逻辑操作符重载;

           4,使用全局函数对逻辑操作符进行重载;

               1,当必须实现逻辑操作符的重载时,用全局函数实现;

          

    6,小结:

        1,C++ 从语法上支持逻辑操作符重载;

        2,重载后的逻辑操作符不满足短路法则;

        3,工程开发中不要重载逻辑操作符;

        4,通过重载比较操作符替换逻辑操作符重载;

        5,通过专用成员函数替换逻辑操作符重载;

  • 相关阅读:
    原生化:AnDevCon 2014 McVeigh 的主题演讲
    MVC 5 App 通过 Facebook OAuth2 登陆(Sign-on)的问题
    MVC 5 第三章 HTML Helper
    Node.js 初探
    MVC 5 第二章 项目结构
    MVC 5 第一章 起航
    新的开始
    Xcode开发如何在调试时轻松找到程序在哪里崩溃?
    100个直接可以拿来用的JavaScript实用功能代码片段(转)
    js得到当前页面的url信息方法(JS获取当前网址信息)
  • 原文地址:https://www.cnblogs.com/dishengAndziyu/p/10913820.html
Copyright © 2020-2023  润新知