C 中的運算子過載

2022-02-15 07:53:48 字數 3236 閱讀 2542

首先思考以下幾個問題:

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;

superstar star2;

cout << "親愛的經紀人,請創造1號女星:";

cin >> star1;

cout << "請創造2號女星:";

cin >> star2;

cout << "1號" << star1 << ";2號" << star2 << endl;;

cout << "她們" << ((star1 == star2) ? "相同" : "不相同") << endl;

上面使用了復合賦值運算子+=,這一點後面會將。(note:如果類同時定義了算術運算子和復合賦值運算子,通常應使用復合賦值運算子來實現算術運算子)

鳳咀對自己名字不滿意,於是想改名叫飯冰冰。

:「我叫飯冰冰,你愛我嗎?」

superstar & superstar::operator=(const superstar &star)

return *this;

}

這裡要注意賦值給自己的情況,有一本叫《c++沉思錄》的書裡面有深入的講解。

賦值運算子必須定義為成員函式。

鳳咀想:直接叫別人的名字不太好,把她名字加在我後面吧!

:「我叫鳳咀飯冰冰,你還愛我嗎?」

superstar & superstar::operator+=(const superstar &star)

復合賦值運算子不非得是類的成員,不過傾向於把所有賦值運算都定義在類內部。

首先在類中定義它們:

superstar &operator++();

superstar &operator--();

具體實現:

superstar & superstar::operator++()

superstar & superstar::operator--()

注意其中檢查是否越界,如果越界,將會丟擲out_of_range異常。

為了區分前置與後置,後置版本接受乙個額外的(不使用的)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 只是一種 語法上的方便 也就是它只是另一種函式呼叫的方式,只是為了方便我們使用,運算子只能運算內建的資料型別,對於自定義的資料型別不能運算,所以我們可以過載...