C 過載操作符與轉換

2021-06-28 14:18:56 字數 1344 閱讀 9268

明智的使用操作符過載可以使類型別的使用像內建型別一樣直觀。

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

過載操作符並不保證運算元的求值順序,尤其是,不會保證內建邏輯and、邏輯or和逗號操作符的運算元求值,在&&和||的過載版本中,兩個運算元都要進行求值,而且對運算元的求值順序不作規定,因此,過載&&、||或逗號操作符不是一種好的做法。

一般將算術和關係操作符定義為非成員函式,而將賦值操作符定義為成員。

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

將要用作關聯容器鍵型別的類應該定義《操作符。關聯容器預設使用鍵型別的《操作符。即使該型別將只儲存在順序容器中,類通常也應該定義==和《操作符,理由是許多演算法假設這些操作符存在,例如sort使用<,而find使用==操作符。

如果類定義了相等操作符,它也應該定義!=,同樣的規則也應用於其他關係操作符,如果定義了<,則也應該定義》,>=,<,<=。

賦值,下標,呼叫和成員訪問箭頭等操作符必須定義為成員,將這些操作符定義為非成員函式將在編譯時標記為錯誤

像賦值一樣,復合賦值操作符通常應定義為類的成員,與賦值不同的是,不一定非得這樣做,如果定義為非成員復合賦值操作符,不會出現編譯錯誤。

改變物件狀態或與給定型別緊密聯絡的其他一些操作符,如自增,自減和解引用,通常為類的成員

對稱的操作符,如算術操作,相等操作等等,最好定義為普通非成員函式。

ostream& operator <<(ostream& os,const classtype &object),當定義符合標準庫iostream規範的輸入或輸出操作符的時候,必須使它成為非成員操作符,否則,左運算元將只能是該類型別的物件。此外,io操作符通常對非公用資料成員進行讀寫,因此,類通常將io操作符設為友元。

更重要但通常重視不夠的是,輸入和輸出操作符如下區別:輸入操作符必須處理錯誤和檔案結束的可能性。

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

類定義下標操作符時,一般需要定義兩個版本:乙個為非const成員並返回引用,另乙個為const成員並返回const引用。

像下標操作符一樣,我們需要解引用操作符的const和非const版本。它們的區別在於返回型別:const成員返回const引用以防止使用者改變基礎物件。

過載箭頭操作符必須返回指向類型別的指標,或者返回定義了自己的箭頭操作符的類型別物件。

為了與內建型別一致,字首式操作符應該返回被增量或減量物件的引用

字尾式操作符函式接受乙個額外的int型形參,以示區分字首

為了與內建操作符一致,字尾式操作符應返回舊值,並且,應作為值返回,而不是返回引用。

過載操作符與轉換

過載操作符函式 保留字operator後接需要定義的操作符號,有返回型別和形參表 不能過載的操作符有 不能通過連線其他合法符號來建立任何新的操作符 過載操作符必須具有乙個類型別運算元,以為如果只有內建型別物件的話,會重新定義原來的操作符 操作符的優先順序和結合性是固定的 不再具備短路求值特性 當運算...

C Primer 過載操作符與轉換

1.不能通過連線其他合法符號來建立任何新的操作符,例如試圖定義乙個operator 操作符以提供求冪操作是非法的 用於內建型別的操作符其含義不能改變,例如 int operator int,int 就是非法的 也不能為任何內建型別定義額外的新的操作符,例如不能定義接受兩個陣列型別運算元的operat...

C 過載型別轉換操作符

在需要做資料型別轉換時,一般顯式的寫法是 cpp view plain copy font size 18px type1 i type2 d i type1 d 顯式的寫型別轉,把d從type2型別轉為type1型別 這種寫法不能做到無縫轉換,也就是直接寫 i d,而不需要顯式的寫 type1 來...