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,通过专用成员函数替换逻辑操作符重载;

原文地址:https://www.cnblogs.com/dishengAndziyu/p/10913820.html