然而想想在更多的運算需求中,您可能對+、-、*、/、%等等的運算子都想有基本型態與自訂型態運算的需求,為每一個需求都重載相對應的運算子似乎是不合 效率的,內建的型態轉換行為在 算術 (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() {
....
}
};
public:
....
operator Other() {
....
}
};
要注意的是轉換函式不能有參數列。
沒有留言:
張貼留言