c 過載運算與型別轉換

2022-04-12 03:39:00 字數 1674 閱讀 8141

1. 基礎概念

過載的運算子是具有特殊名字的函式:(過載運算子函式,運算子函式。過載運算子)

依次包含返回型別,函式名(operator=),引數列表,函式體。

只有過載的函式呼叫運算子operator()才能有預設實參。

關於引數的數量,一般來說,一元運算子有乙個引數,二元有兩個,三元有三個;

但是如果該運算子函式是成員函式,則其中乙個運算物件將是本類物件,第乙個引數隱式繫結到this常量指標上,不顯示在引數列表中。成員運算子函式的引數數量比運算子物件少乙個。

hasptr& operator=(const hasptr&right)

運算子函式要麼是乙個類型別的成員函式,要麼它必有類型別的引數。這是因為不能過載內建型別之間的運算(可以過載類型別與類型別之間的運算,類型別和內建型別之間的運算)。

不能自己發明運算子,不能改變運算子的優先順序,也不能改變運算子原始運算物件的個數,例如&運算子可以用於一元運算,也可以用於二元運算,則根據引數數量判斷是一元還是二元,但是!操作符永遠不可能過載為二元運算子。

2. 乙個例子

可以先看乙個簡單的例子,過載了類型別data的 "+" 二元運算子,該運算子函式不是成員函式,因此,引數為兩個類型別,返回的是類型別中string成員的拼接版(中間加入--)

#include #include 

using

namespace

std;

class

data

data(

string

str)

string

str;

};string

operator+(const data& data1, const data&data2)

intmain()

輸出:

hello -- slam -- !!!

若希望將操作符函式定義為data類的成員函式,則需要改動如下:

#include #include 

using

namespace

std;

class

data

data(

string

str)

string

str;

data

operator+(const data&data);

};//

只有將返回值定義為data型別,表示式才能使用連續運算的形式data1+data2+data3

data data::operator+(const data&data)

intmain()

輸出結果相同。

注意在第乙個例子中(非成員函式)

data1+data2 等價於 operator+(data1, data2)

第二個例子中(成員函式呼叫)

data1+data2 等價於 data1.operator+(data2)

3. 常用過載運算子

1) 輸入輸出運算子 << >>

2) 算數和關係運算子 == != <

3) 賦值運算子 = 

4) 下標運算子

5) 遞增和遞減運算子 ++ --

6) 成員訪問運算子 * ->

7) 函式呼叫運算子 () 

過載運算與型別轉換

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

C 知識 過載運算與型別轉換

最後,如果有理解不對的 地方,希望大家不吝賜教,謝謝!c 系列 前一章 拷貝控制 下一章 待續 當運算子作用於類型別的運算物件時,可以通過運算子過載重新定義該運算子的含義。明智地使用運算子過載能令我們的程式更易於編寫和閱讀。過載的運算子是具有特殊名字的函式 它們的名字由關鍵字operator和其後要...

C 之過載運算與型別轉換

賦值運算子 算術和關係運算子 下標運算子 遞增和遞減運算子 過載 型別轉換與運算子 過載的運算子是具有特殊名字的函式 它們的名字由關鍵字operator和其後要定義的運算符號共同組成。和其他函式一樣,過載的運算子也包含返回型別 引數列表以及函式體。對於乙個運算子函式來說,它或者是類的成員,或者至少含...