chap 13 過載操作符與轉換 過載函式的匹配

2021-05-26 22:45:35 字數 2489 閱讀 9840

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

2、不能過載的操作符有:   條件操作符(?:)、指向類成員操作的指標( .*)、作用域解析操作符(::)  

3、不應該過載的操作符:   取址操作符(&)、逗號操作符(,)、邏輯與操作符(&&)、邏輯或操作符(||)

4、對於任意二元操作符@,aa@bb被解析為:aa.operator@(bb)或operator@(aa,bb);對任意一元操作符@,@aa被解析為:aa.operator@()或operator@(aa) 

過載操作符通常要考慮的兩個問題,是否作為成員函式,返回型別;下面逐個說明:

5、必須作為非靜態成員函式的操作符: 賦值(=)、下標([ ])、呼叫(( ))、成員訪問箭頭(->)、轉換操作符

6、通常作為非靜態成員函式的操作符:符合賦值、自增、自減

7、必須作為非成員函式的操作符:輸入輸出操作符(<< 和》)

8、通常作為非成員函式的操作符:對稱的操作符(比如:算術操作符,==,關係操作符,位操作符);通常把非成員函式的操作符設定為所操作類的」友元「

9、賦值操作符的過載注意:作為成員函式;返回reference to *this;處理」自我賦值「,使用語句 if(*this == &rhs);

10、下標操作符的過載注意:作為成員函式;返回引用(因為下標操作符是左值);定義兩個版本(const成員和非const成員)

11、成員訪問操作符(->和*)的過載注意:作為成員函式,不接受顯示形參;operator->的返回型別必須是 指向類型別的指標 或 定義了自己的箭頭操作符的類型別物件;比如:**: point -> action(); //如果point是乙個指標,指向具有名為action的成員的物件,改**的作用是呼叫該物件的action成員;否則,如果point定義了自己的operator->,則執行point的operator->()

12、呼叫操作符的過載注意:即operator();定義了呼叫操作符的類稱為函式物件(function object)

13、轉換操作符(conversion operator):通用形式為operator type();必須是成員函式;不能指定返回型別;不顯示接受形參;轉換操作符引起類型別的轉換;

過載函式的匹配:

1、可行函式:函式的形參個數與呼叫的實參個數相同(預設實參例外),且每乙個實參的型別必須與對應形參的型別匹配 或者 可被隱身轉換為對應的形參型別;

2、含有乙個形參的過載函式的匹配,根據轉換等級類確定;

含有多個形參的匹配,匹配成功應該滿足下列條件:(1)其每個形參的匹配都不劣於其他可行函式提供的匹配;(2)至少有乙個實參的匹配優於其他可行函式提供的匹配;如果不滿足這兩個條件,就會出錯(出錯的可能性之一是二義性);

3、為了確定最佳匹配,編譯器將實參型別到相應形參型別的轉換劃分等級;轉換等級以降序排列如下:

(1)精確匹配(exact match): 實參與形參型別相同;

(2)通過型別提公升(promotion):比如:所以比int小的型別提公升到int;

(3)通過標準轉換(standard conversion):使用static_cast/const_cast/reinterpret_cast或者c語言風格的強制轉換;

(4)t通過類型別轉換(class-type conversion):建構函式/轉換操作符

4、過載和const形參:只有形參是引用或指標時,形參是否為const才有影響;可基於函式的引用/指標形參是指向const物件還是指向非const物件來實現過載;const實參只能匹配const形參,非const實參既可以匹配非const實參 也可以匹配const實參,但非const實參是精確的匹配;

5、如果過載中的兩個函式可以用 同一轉換函式 匹配,則使用在轉換之後或之前的標準轉換序列的等級來確定最佳匹配

struct smallint

int val;

};void computer(int);

void computer(double);

void computer(long double);

smallint obj;

computer(obj);//ok; smallint只能轉換成int,最佳匹配為computer(int)

如果可以使用不同」 轉換操作「,編譯器認為這兩個匹配一樣好,不管之前或之後的標準轉換序列的等級如何,都會產生歧義

struct smallint

operator double()

int val;

double dval;

};void computer(int);

void computer(double);

void computer(long double);

smallint obj;

computer(obj);//error ;因為smallint可以轉換成int或double,所以存在不同的 轉換操作 ,從而產生歧義;

9 過載操作符

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

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

過載操作符的定義 過載操作符是具有特殊名稱的函式 保留字operator後接需定義的操作符符號。過載操作符具有返回型別和形參表。eg sales item operator const sales item const sales item 過載操作符必須具有乙個類型別運算元 用於內建型別的操作符其...

C 14 過載操作符與轉換

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