發新話題

C++ Gossip - 物件基礎《封裝的進階議題》使用者自訂型態轉換

C++ Gossip - 物件基礎《封裝的進階議題》使用者自訂型態轉換

在 使用 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() {
        ....
    }

};


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

TOP

發新話題

本站所有圖文均屬網友發表,僅代表作者的觀點與本站無關,如有侵權請通知版主會盡快刪除。