首先思考以下幾個問題:
1.什麼是運算子過載?
2.為什麼要過載運算子,它有什麼用?
3.可以過載哪些運算子?
4.過載運算子有哪些規則?
我們在程式中使用各種操作符,比如加(+)、賦值(=)等等。運算子過載可以重新賦予操作符的含義,舉個栗子,對於加號操作符,一般都是將兩個數進行相加,而不能將兩個自定義類的物件相加,但是通過運算子過載可以這麼做。
過載運算子是具有特殊名稱的函式,函式具有哪些特徵呢?1.函式名稱;2.返回型別;3.引數列表;4.函式體。
1.名稱的寫法是保留字operator後接需定義的操作符號;
2.返回型別後面再說;
3.引數:引數數目與該運算子作用的運算物件數目相同,但如果是作為乙個類的成員函式,(顯式)引數數目比運算物件總數少乙個(因為有乙個隱含的this形參)。
只知道哪些可以、哪些不可以被過載,沒有太大意義。
如果是非成員運算子函式:
star1 + star2; //普通表示式如果是成員運算子函式:operator+(star1, star2); //等價的函式呼叫
star1 += star2; //基於呼叫的表示式大多數人平時很少用到運算子過載,因為運算子過載的功能一般都可以通過直接寫乙個普通函式實現。但運算子過載可以使的程式更加「優美」,在有的情形下,可以使我們更容易使用標準庫容器和演算法。star1.operator+=(star2); //等價的呼叫
我們現在有乙個類superstar,代表超級巨星,它有乙個成員變數代表巨星的姓名。
現在我們的任務是輸入、輸出巨星的名字。
class superstar輸出運算子第乙個引數是ostream的引用,第二個引數是乙個常量的引用。;
ostream &operator<輸入運算子第乙個引數是將要讀取的流的引用,第二個引數是將要讀入到的物件的引用。
istream &operator>>(istream &is, superstar &star)值得注意的是引數為什麼是引用,還有引數為什麼是/不是常量。
輸入輸出運算子必須是非成員函式,但是io運算子需要讀寫類的非公有成員,所以一般被宣告為友元。
friend istream& operator>>(istream &, superstar &);讓我們試一下效果:friend ostream& operator<
假如現在有2個明星,乙個叫飯冰冰,另乙個叫鳳咀
我們根據名字來判斷她們是不是一樣的(這樣做也許有失合理,請不要太在意細節)
bool operator==(const superstar &star1, const superstar &star2)
bool operator!=(const superstar &star1, const superstar &star2)
superstar star1;上面使用了復合賦值運算子+=,這一點後面會將。(note:如果類同時定義了算術運算子和復合賦值運算子,通常應使用復合賦值運算子來實現算術運算子)superstar star2;
cout << "親愛的經紀人,請創造1號女星:";
cin >> star1;
cout << "請創造2號女星:";
cin >> star2;
cout << "1號" << star1 << ";2號" << star2 << endl;;
cout << "她們" << ((star1 == star2) ? "相同" : "不相同") << endl;
鳳咀對自己名字不滿意,於是想改名叫飯冰冰。
:「我叫飯冰冰,你愛我嗎?」
superstar & superstar::operator=(const superstar &star)這裡要注意賦值給自己的情況,有一本叫《c++沉思錄》的書裡面有深入的講解。return *this;
}
賦值運算子必須定義為成員函式。
鳳咀想:直接叫別人的名字不太好,把她名字加在我後面吧!
:「我叫鳳咀飯冰冰,你還愛我嗎?」
superstar & superstar::operator+=(const superstar &star)復合賦值運算子不非得是類的成員,不過傾向於把所有賦值運算都定義在類內部。
首先在類中定義它們:
superstar &operator++();具體實現:superstar &operator--();
superstar & superstar::operator++()注意其中檢查是否越界,如果越界,將會丟擲out_of_range異常。superstar & superstar::operator--()
為了區分前置與後置,後置版本接受乙個額外的(不使用的)int型別的引數。
superstar & superstar::operator++(int)後置運算子呼叫各自的前置版本來完成實際的工作。superstar & superstar::operator--(int)
以上只是運算子過載的一小部分,想認識更多還需要多看書多思考。
C 中運算子過載
運算子過載使得使用者自定義的資料以一種更簡潔的方式工作。比如int x,y 可以為y x y 而 my c1,c2 如果想使得兩個自定義的物件相加,以前只能調 用函式計算它們的和。而現在只要定義了運算子過載就能實現c1 c1 c2.所謂過載,就是重新賦予新的含義。函式過載就是對乙個已有的函式賦予新的...
C 中運算子過載
運算子過載可以寫在類的內部,也可以寫成全域性函式形式,其中運算子 在過載時必須宣告為類的成員函式 而運算子 sizeof 不能被過載 演算法運算子的過載不會改變運算子原有的優先順序。例子 include include include using namespace std class comple...
C 中的運算子過載(一) 運算子過載的概念
概述 運算子過載,就是對已有的運算子重新進行定義,賦予其另一種功能,以適應不同的資料型別。運算子過載 operator overloading 只是一種 語法上的方便 也就是它只是另一種函式呼叫的方式,只是為了方便我們使用,運算子只能運算內建的資料型別,對於自定義的資料型別不能運算,所以我們可以過載...