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