C Primer筆記 14 過載操作符與轉換

2021-05-09 16:15:21 字數 2629 閱讀 2777

過載操作符的定義

過載操作符是具有特殊名稱的函式:保留字operator後接需定義的操作符符號。過載操作符具有返回型別和形參表。

eg:sales_item operator+(const sales_item&,const sales_item&);

過載操作符必須具有乙個類型別運算元

用於內建型別的操作符其含義不能改變。例如,內建的整型加號操作符不能重定義:

//error:cannot redefine built-in operator for ints

int operator+(int,int);

也不能為內建資料型別重定義加號操作符。如,不能定義接受兩個陣列型別運算元的operator+。

過載操作符必須具有至少乙個類型別或列舉型別的運算元。這條規則強制過載操作符不能重新定義用於內建型別對有的操作符的含義。

優先順序和結合性是固定的。

除了函式呼叫操作符operator()之外,過載操作符時使用預設實參是非法的。

類成員與非成員

作為類成員的過載函式,其形參看起來比運算元數目少1。作為成員函式的操作符有乙個隱含的this形參,限定為第乙個運算元。

操作符過載和友元關係

操作符定義為非成員函式時,通常必須將它們設定為所操作類的友元。 

過載操作符的設計:

不要過載具有內建含義的操作符

大多數操作符對類物件沒有意義

輸入和輸出操作符

輸出操作符《的過載

為了與io標準庫一致,操作符應接受ostream&作為第乙個形參,對類型別const物件的引用作為第二個形參,並返回對ostream形參的引用。

eg:ostream& operator <<(ostream& os,const classtype &object

os << //....

return os;

輸入操作符》的過載

輸入操作符的第乙個形參是乙個引用,指向它要讀的流,並且返回的也是對同乙個流的引用。第二個形參是要讀入的物件的非const引用,該形參必須為非const,因為輸入操作符的目的是將資料讀到這個物件中。

輸入和輸出操作符有如下區別:輸入操作符必須處理錯誤和檔案結束的可能性。

eg:istream&

operator>>(istream& in,sales_item& s)

double price;

in >> s.isbn >> s.units_sold >> price;

if(in)

s.revenu = s.units_sold * price;

else

s = sales_item(); // input failed:redst object to default state

return in;

設計輸入操作符時,如果可能,要確定錯誤恢復措施,這很重要。

算術操作符和關係操作符

一般而言,將算術和關係操作符定義為非成員函式,像下面給出的sales_item加法操作符一樣:

sales_item

operator+(const sales_item& lhs, const sales_item&  rhs)

sales_item ret(lhs);  //copy lhs into a local object that we'll return

ret += rhs;  //add in the contents of rhs

return ret; //return ret by value

相等操作符

inline bool

operator==(const sales_item &lhs,const salesitem &rhs)

return lhs.units_sold == rhs.units_sold &&

lhs.revenue == rhs.revenue &&

lhs.same_isbn(rhs);

inline bool

operator!=(const sales_item &lhs,const sales_item &rhs)

return !(ls == rhs);  //!= define in terms of operator==

關係操作符

定義了相等操作符的類一般也具有關係操作符。龍其是,因為關聯容器和某些演算法使用小於操作符,所以定義operator《可能相當有用。

賦值操作符

賦值操作符可以過載,無論形參為何種型別,賦值操作符必須定義為成員函式,這一點與復合賦值操作符有所不同。

賦值必須返回對*this的引用

eg:sales_item& sales_item::operator++(const sales_item& rhs)

units_sold += rhs.units_sold;

revenue += rhs.revenue;

return * this;

下標操作符

下標操作符必須定義為類成員函式。

成員訪問操作符

為了支援指標型類,例如迭代器,c++語言允許過載解引用操作符(*)和箭頭操作符(->)。

箭頭操作符必須定義為類成員函式。解引用操作符不要求定義為成員,但將它作為成員一般也是正確的。

C 14 過載操作符與轉換

cat.h pragma once include include using std string using std ostream using std istream class cat cat string name name name 過載輸入 輸出操作符 若供外部使用,寫非成員函式的樣子...

9 過載操作符

include includeusing namespace std class num void print 也可以在內部提供乙個 號操作符過載,但和全域性 號過載如果呼叫方法一致,就只能存在乙個 num operator num other 過載 是修改自身,不能返回新物件,所以要返回自身引用 ...

c 學習筆記3 過載

c 允許在同一作用域中的某個函式和運算子指定多個定義,分別稱為函式過載和運算子過載。過載宣告是指乙個與之前已經在該作用域內宣告過的函式或方法具有相同名稱的宣告,但是它們的引數列表和定義 實現 不相同。當您呼叫乙個過載函式或過載運算子時,編譯器通過把您所使用的引數型別與定義中的引數型別進行比較,決定選...