操作過載與型別轉換

2021-09-14 00:11:51 字數 2758 閱讀 7958

運算子在某種程度上也是一種函式,它是一種名為跟在關鍵字operator後的符號的函式,它也有返回值、引數列表、函式體,運算子的過載必須滿足一下兩個條件中的乙個:1、是某個類的成員函式2、它的引數中有某種類型別。因此是不允許對內建型別進行運算子過載的,另外大部分的運算子都是可以過載的,但是也有四到五個不能被過載。注意:作為成員函式的運算子,this指標繫結到運算子的左側物件,其(顯式)引數數量比運算物件少乙個。

過載輸出運算子

一般情況下,乙個輸出運算子的第乙個引數是乙個非常量的ostream引用,第二個引數是乙個常量的類型別引用,返回值是乙個ostream的形參,乙個實際的例子如下:

ostream operator<
賦值運算子應返回其左側物件的引用,賦值運算子必須定義為成員函式。復合賦值運算子也盡量這樣做,乙個例子:

//this指標隱式繫結到運算子的左側物件

sales_data& operator+=(const sales_data& rhs)

strblob& operator--()

後置版本的則需要返回乙個數值,而不是乙個引用,例子如下:

//為了區分前置和後置,在宣告後置時有乙個不使用的int型的形參,僅做區分使用

strblob operator++(int)

如果乙個類或者結構體重載了函式呼叫運算子,那麼我們可以像呼叫函式一樣呼叫物件,乙個具體例子如下:

struct abcint

//具體使用

int i=-1;

abcint abc;

//輸出i的絕對值

cout雖然abc僅僅是乙個物件但在使用時卻像呼叫了乙個函式一樣,函式呼叫運算子必須是類的成員函式。另外,乙個類可以定義多個函式呼叫符但是在返回值和引數數量上需要有所區分。

plusintadd;

int sum=intadd(10,30);//等價於sum=30;

其餘類似的一些操作如下表:

在標準庫演算法中使用標準庫函式物件:比如對於sort演算法,在預設情況下對於儲存了string的vector進行排序時,使用的是預設的《按公升序排列,但是如果我們想要按照降序排列時就可以傳入乙個greater進行修改預設的比較符,sort(svec.begin(),svec.end(),greater()).

另外需要特別注意的一點是,不允許對指標進行比較,會產生未定義的行為,但是標準庫中允許比較指標的位址,進行sort:

vectornametable;

sort(nametable.begin(),nametable.end(),less());

int add(int i,int j);

//lambda表示式

auto mod=(int i,int j);

//結構體,函式物件類

struct divide

//三者的呼叫形式都是int(int,int)

可以考慮在乙個map中儲存這些可呼叫物件,進行計算,形如mapbindops,bindops.insert();但是不能將mod存入,因為mod不是函式指標。為了能有一種統一的格式,可以使用標準庫型別function,function儲存在functional標頭檔案中。可以宣告為如下形式:

functionf1=add;

重新宣告map為map> binops,我們可以將所有的呼叫物件加入到該map中,只要他們的呼叫型別統一是int(int,int)形式的即可。

std::map>  binops =

, // function pointer

, // library functor

, // user-defined functor

}, // unnamed lambda

// named lambda object

};

我們不能將過載的函式名放入function中,因為無法進行區分,最好是使用函式指標進行指定,將相應的函式指標放入function中。

型別轉換運算子

為了防止隱式的型別轉換被混亂使用,有時可以使用關鍵字explicit來進行標註,這樣編譯器就不會自動呼叫該顯式的型別轉換運算子進行轉換,除非顯式的使用static_cast進行強制的轉換。如下:

class smallint

};smallint si=3;//正確,smallint的建構函式不是顯式的

si+3; //錯誤:此處需要隱式的型別轉換,但是類的運算子是顯式的

static_cast(si)+3;//正確:顯式的請求型別轉換。

避免有二義性的型別轉換

函式匹配與過載運算子

過載運算與型別轉換

1.基本概念 名字由關鍵字operator和其後要定義的運算符號共同組成。對於乙個運算子來說,它或者是類的成員,或者至少含有乙個類型別的引數。通常情況下,不應該過載逗號 取位址 邏輯與和邏輯或運算子。2.當我們定義過載的運算子時,必須首先決定是將其宣告為類的成員函式還是宣告為乙個普通的非成員函式。一...

C 過載型別轉換操作符

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

過載操作符與轉換

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