什麼是多載運算子
在 函數進階介紹 那篇文中,我們講到函數可以被多載。意思是只要函數原型不同,即使函數名稱相同,編譯器依然可以分辨我們是想使用哪個函數。
在 C++ 中,運算子的底層邏輯其實也是透過函數給實做出來的!
因此,我們可以透過多載函數,來做到讓運算子根據收到的資料型態,做出不同的反應。這就是所謂的多載運算子。
是不是有聽沒有懂?
沒有關係!這很正常!我們先繼續看下去。
運算子底層邏輯
前一節講到,運算子的底層邏輯是透過函數給實做出來的。
這是什麼意思呢?
我們來看看一個簡單的運算子:
int a = 1; int b = 2; int c = a + b;
我想沒有人會看不懂這上面的程式碼在做什麼,但是編譯器是怎麼看的呢?
其實,編譯器看到的是這個樣子的:
int c = operator+(a, b);
編譯器其實看到的是我們呼叫了一個函數,這個函數叫做 operator+
,並且傳進了兩個整數型態的參數 a
和 b
,最後這個函數回傳結果。
我們可以知道這個函數原型大概就是長這樣:
int operator+(int a, int b);
如果是兩個浮點數,那大概會長這樣:
float operator+(float a, float b);
那問題來了,如果今天出現了沒有被定義的使用方式呢?
比如說:
string text1 = "abc"; string text2 = "def"; string text3 = text1 + text2;
這樣會怎麼樣呢?你可能會覺得 text3
就是 abcdef
,但其實程式碼會被錯,這就是因為編譯器找不到被定義的使用方式!
而這就是多載運算子表現的地方了!
我們可以自己去寫一個類似以下這樣的函數,讓編譯器知道兩個字串可以相加!
string operator+(string a, string b);
多載運算子限制
但是,我們在多載運算子時,也需要遵守幾個規則。
並非所有運算子都可以多載
大多數的運算子都可以多載。除了幾個例外:
- 條件運算子
?:
- 大小運算子
sizeof
- 範圍解析運算子
::
- 類成員選擇運算子
.
- 成員指標選擇運算子
.*
- 物件類型運算子
typeid
固定參數數目
如果一個運算子只能使用兩個參數,比如說 +
,那你多載運算子時也只能使用兩個參數。
也就是說,你不能做類似這樣的事:
operator+(int, int, int);
只能多載現有運算子
我們無法創造一個不存在的運算子並多載它,也無法重新命名一個運算子。
至少一個參數必須為使用者定義型態
所謂的「使用者定義型態」,就是指我們自己所創造的結構或類別。
意思就是說,我們不能多載以下的函數原型,:
operator+(int, int);
但可以多載這樣的函數原型:
operator+(int, MyObject);
總結
這章主要只是介紹了運算子的背後運作邏輯,以及什麼是運算子多載而已,因此相對簡短。
接下來幾章,我們就會仔細介紹要如何多載一個運算子!
那這篇就到這裡啦!有學到東西的話可以留五星評價喔!