多載運算子基本介紹

運算子 那篇文章中,我們介紹了什麼是運算子 Operator,也對運算子進行了分類。

這章我們要來介紹一個新觀念:多載運算子!這個觀念非常重要,常常會在進階的類別應用中出現!

什麼是多載運算子

函數進階介紹 那篇文中,我們講到函數可以被多載。意思是只要函數原型不同,即使函數名稱相同,編譯器依然可以分辨我們是想使用哪個函數。

在 C++ 中,運算子的底層邏輯其實也是透過函數給實做出來的!

因此,我們可以透過多載函數,來做到讓運算子根據收到的資料型態,做出不同的反應。這就是所謂的多載運算子。

是不是有聽沒有懂?

沒有關係!這很正常!我們先繼續看下去。

運算子底層邏輯

前一節講到,運算子的底層邏輯是透過函數給實做出來的。

這是什麼意思呢?

我們來看看一個簡單的運算子:

int a = 1;
int b = 2;
int c = a + b;

我想沒有人會看不懂這上面的程式碼在做什麼,但是編譯器是怎麼看的呢?

其實,編譯器看到的是這個樣子的:

int c = operator+(a, b);

編譯器其實看到的是我們呼叫了一個函數,這個函數叫做 operator+,並且傳進了兩個整數型態的參數 ab,最後這個函數回傳結果。

我們可以知道這個函數原型大概就是長這樣:

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);

總結

這章主要只是介紹了運算子的背後運作邏輯,以及什麼是運算子多載而已,因此相對簡短。

接下來幾章,我們就會仔細介紹要如何多載一個運算子!

那這篇就到這裡啦!有學到東西的話可以留五星評價喔!