運算子過載的作用是什麼?
它允許你為類的使用者提供乙個直覺的介面。
運算子過載允許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...