C++筆記 第三十八課 邏輯操作符的陷阱---狄泰學院
阿新 • • 發佈:2018-11-23
如果在閱讀過程中發現有錯誤,望評論指正,希望大家一起學習,一起進步。
學習C++編譯環境:Linux
第三十八課 邏輯操作符的陷阱
1.潛規則
邏輯運算子的原生語義
運算元只有兩種值(true和false)
邏輯表示式不用完全計算就能確定最終值—短路規則
最終結果只能是true或者false
38-1 邏輯表示式
#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; }
2.過載邏輯操作符
邏輯操作符可以過載嗎?過載邏輯操作符有什麼意義?
38-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(1) || func(0) ) { cout << "Result is true!" << endl; } else { cout << "Result is false!" << endl; } return 0; }
問題的本質分析
1.C++通過函式呼叫擴充套件操作符的功能
2.進入函式體前必須完成所有引數的計算
3.函式引數的計算次序是不定的
4.短路法則完全失效
邏輯操作符過載後無法完全實現原生的語義
一些有用的建議
實際工程開發中避免過載邏輯操作符
通過過載比較操作符代替邏輯操作符過載
直接使用成員函式代替邏輯操作符過載
使用全域性函式對邏輯操作符進行過載
小結
C++從語法上支援邏輯操作符過載
過載後的邏輯操作符不滿足短路原則
工程開發中不要過載邏輯操作符
通過過載比較操作符代替邏輯操作符過載
通過專用成員函式替換邏輯操作符過載