運算子過載

2021-04-07 09:53:16 字數 1368 閱讀 9815

運算子過載的作用是什麼?

它允許你為類的使用者提供乙個直覺的介面。

運算子過載允許c/c++的運算子在使用者定義型別(類)上擁有乙個使用者定義的意義。過載的運算子是函式呼叫的語法修飾:

class fred ;

#if 0

// 沒有運算子過載:

fred add(fred, fred);

fred mul(fred, fred);

fred f(fred a, fred b, fred c)

#else

// 有運算子過載:

fred operator+ (fred, fred);

fred operator* (fred, fred);

fred f(fred a, fred b, fred c)

#endif

通過過載類上的標準運算子,你可以發掘類的使用者的直覺。使得使用者程式所用的語言是面向問題的,而不是面向機器的。

最終目標是降低學習曲線並減少錯誤率。

運算子過載使得類的使用者的工作更簡易,而不是為類的開發者服務的!

考慮一下如下的例子:

class array ;

inline

int& array::operator (unsigned i)  

// 有些人不喜歡這種語法

有些人不喜歡operator關鍵字或類體內的有些古怪的語法。但是運算子過載語法不是被期望用來使得類的開發者的工作更簡易。它被期望用來使得類的使用者的工作更簡易:

int main()

記住:在乙個面向重用的世界中,使用你的類的人有很多,而建造它的人只有乙個(你自己);因此你做任何事都應該照顧多數而不是少數。

什麼運算子能/不能被過載?

大多數都可以被過載。c的運算子中只有 .

和 ? :(以及sizeof,技術上可以看作乙個運算子)。c++增加了一些自己的運算子,除了::和.*,大多數都可以被過載。

這是乙個下標運算子的示例(它返回乙個引用)。先沒有運算子過載:

class array 

private:

int data[100];

};int main()

現在用運算子過載給出同樣的邏輯:

class array 

private:

int data[100];

};int main()

我能過載 operator== 以便比較兩個 char 來進行字串比較嗎?

不行:被過載的運算子,至少乙個運算元必須是使用者定義型別(大多數時候是類)。

但即使c++允許,也不要這樣做。因為在此處你應該使用類似 std::string的類而不是字元陣列,因為陣列是有害的。因此無論如何你都不會想那樣做的。

運算子過載之過載型別運算子

普通型別 類型別 呼叫對應的只有乙個引數 引數的型別就是這個普通型別 的建構函式 需求 boy boy1 10000 薪資 建構函式boy int boy boy2 rock 姓名 建構函式boy char 普通型別賦值給類型別其實很簡單,就是專門的對這個賦值的型別定義乙個建構函式。編譯器在執行 的...

運算子過載 賦值運算子的過載

有時候希望賦值運算子兩邊的型別可以不匹配,比如,把乙個int型別變數賦值給乙個complex物件,或把乙個 char 型別的字串賦值給乙個字串物件,此時就需要過載賦值運算子 注意 賦值運算子 只能過載為成員函式 賦值運算子過載例項示例 include include using namespace ...

運算子過載

c 中的運算子 1。大多數系統預定義運算子都能過載 不值得過載 不能被過載 2過載不能改變優先順序 不能改變結合性 不能改變運算子所需運算元的個數 過載後,可按這些運算子的表達方式使用 運算子過載的語法 一 通過運算子過載函式進行過載 1。運算子過載函式是成員函式 語法形式 type x opera...