C++中的逻辑操作符重载
生活随笔
收集整理的這篇文章主要介紹了
C++中的逻辑操作符重载
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 1 C++中的邏輯操作符重載
- 1.1 邏輯操作符的原生語義
- 1.2 重載邏輯操作符
- 1.3 邏輯操作符重載的建議
1 C++中的邏輯操作符重載
1.1 邏輯操作符的原生語義
邏輯操作符的原生語義如下:
- 操作數只有兩種值(true和flase)。
- 邏輯表達式不用完全計算就能確定最終值,短路原則。
- 最終結果只能是true或者false。
我們先來看一下邏輯表達式的輸出結果:
#include <iostream> #include <string>using namespace std;int func(int i) {cout << "int func(int i) : i = " << i << endl;return i; }int main() {if( func(0) && func(1) ){cout << "Result is true!" << endl;}else{cout << "Result is false!" << endl;}cout << endl;if( func(0) || func(1) ){cout << "Result is true!" << endl;}else{cout << "Result is false!" << endl;}return 0; }輸出結果如下:
1.2 重載邏輯操作符
我們看一下重載邏輯操作符后其語義會發生什么變化:
#include <iostream> #include <string>using namespace std;class Test {int mValue; public:Test(int v){mValue = v;}int value() const{return mValue;} };bool operator && (const Test& l, const Test& r) {return l.value() && r.value(); }bool operator || (const Test& l, const Test& r) {return l.value() || r.value(); }Test& func(Test& i) {cout << "Test func(Test i) : i.value() = " << i.value() << endl;return i; }int main() {Test t0(0);Test t1(1);if( func(t0) && func(t1) ){cout << "Result is true!" << endl;}else{cout << "Result is false!" << endl;}cout << endl;if( func(t0) || func(t1) ){cout << "Result is true!" << endl;}else{cout << "Result is false!" << endl;}return 0; }
從結果我們可以看出短路原則失效了!
問題的本質分析:
雖然C++從語法上支持邏輯操作符重載,但是邏輯操作符重載后無法完全實現原生的語義,不滿足短路法則!
1.3 邏輯操作符重載的建議
如下建議從上往下依次遞進,不得已而為之:
- 實際工程中避免重載邏輯操作符。
- 通過重載比較操作符替代邏輯操作符重載(直接和true和false比較)。
- 直接使用成員函數代替邏輯操作符重載。
- 使用全局函數對邏輯操作符進行重載。
參考資料:
總結
以上是生活随笔為你收集整理的C++中的逻辑操作符重载的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 有哪些地方的年夜饭是必吃的?
- 下一篇: C++中逗号操作符的重载