使用者自訂型態轉換(User-Defined Conversions)


使用 friend 函式重載運算子 中,您使用friend函式解決基本型態與自訂型態相加、相減等運算的問題,也就是像10 + someObject、10 - someObject這類的運算可透過friend函式來重載相對應的運算子。

然而想想在更多的運算需求中,您可能對+、-、*、/、%等等的運算子都想有基本型態與自訂型態運算的需求,為每一個需求都重載相對應的運算子似乎是不合 效率的,內建的型態轉換行為在 算術 (Arithmetic)運算、型態轉換(Type conversion) 中有介紹過,所以您該提供的是一個自動型態轉換,在需要的時候,編譯器會根據您的自訂型 態轉換,自動將您的自訂型態轉換為基本型態或您指定的型態。

 直接以實例說明如何自訂型態轉換:
  • Integer.h
class Integer {
public:
Integer(int value) : _value(value) {
}

int value() {
return _value;
}

// 自訂型態轉換
// 當需要將Integer轉換為int時如何執行
operator int() {
return _value;
}

int compareTo(Integer);

private:
int _value;
};

  • Integer.cpp
#include "Integer.h"

int Integer::compareTo(Integer integer) {
if(_value > integer._value) {
return 1;
}
else if(_value < integer._value) {
return -1;
}

return 0;
}

Integer類別將int基本型態包裝為物件,以提供更多物件導向上的操作行為,例如提供compareTo()函式支援兩個Integer實例的比 較,而為了支援與int基本型態的直接算術行為,您使用operator int()定義了如何轉換,當編譯器需要作int型態轉換時,就會使用您自定義的行為,例如:
  • main.cpp
#include <iostream> 
#include "Integer.h"
using namespace std;

int main() {
Integer i1(10);
Integer i2(20);

cout << i1.compareTo(i2) << endl;

cout << i1 + 10 << endl;

return 0;
}

執行結果:
-1
20


operator後緊跟著的即是轉換的目標型態,自定義型態轉換不只可以轉換至基本型態,您也可以指定轉換為自訂義型態,例如:
class Some {
public:
    ....
    operator Other() {
        ....
    }

};

要注意的是轉換函式不能有參數列。