C++中的逻辑操作符重载
生活随笔
收集整理的這篇文章主要介紹了
C++中的逻辑操作符重载
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
文章目錄
- 1 C++中的邏輯操作符重載
- 1.1 邏輯操作符的原生語(yǔ)義
- 1.2 重載邏輯操作符
- 1.3 邏輯操作符重載的建議
1 C++中的邏輯操作符重載
1.1 邏輯操作符的原生語(yǔ)義
邏輯操作符的原生語(yǔ)義如下:
- 操作數(shù)只有兩種值(true和flase)。
- 邏輯表達(dá)式不用完全計(jì)算就能確定最終值,短路原則。
- 最終結(jié)果只能是true或者false。
我們先來(lái)看一下邏輯表達(dá)式的輸出結(jié)果:
#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; }輸出結(jié)果如下:
1.2 重載邏輯操作符
我們看一下重載邏輯操作符后其語(yǔ)義會(huì)發(fā)生什么變化:
#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; }
從結(jié)果我們可以看出短路原則失效了!
問(wèn)題的本質(zhì)分析:
雖然C++從語(yǔ)法上支持邏輯操作符重載,但是邏輯操作符重載后無(wú)法完全實(shí)現(xiàn)原生的語(yǔ)義,不滿足短路法則!
1.3 邏輯操作符重載的建議
如下建議從上往下依次遞進(jìn),不得已而為之:
- 實(shí)際工程中避免重載邏輯操作符。
- 通過(guò)重載比較操作符替代邏輯操作符重載(直接和true和false比較)。
- 直接使用成員函數(shù)代替邏輯操作符重載。
- 使用全局函數(shù)對(duì)邏輯操作符進(jìn)行重載。
參考資料:
總結(jié)
以上是生活随笔為你收集整理的C++中的逻辑操作符重载的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 有哪些地方的年夜饭是必吃的?
- 下一篇: C++中逗号操作符的重载