C++類別別型轉換運算子(無師自通)

2020-07-16 10:04:42
我們知道,運算子函數允許類更像內建資料型別一樣工作。運算子函數可以賦予類的另一個功能是自動型別轉換

資料型別轉換通過內建的資料型別在 "幕後" 發生。例如,假設程式使用以下變數:

int i;
double d;

那麼以下語句會自動將i中的值轉換為 double 並將其儲存在 d 中:

d = i;

同樣,以下語句會將d中的值轉換為整數(截斷小數部分)並將其儲存在i中:

i = d;

類物件也可以使用相同的功能。例如,假設 distance 是一個 Length 物件,d 是一個 double,如果 Length 被正確編寫,則下面的語句可以方便地將 distance 作為浮點數儲存到 d 中:

d = distance;

為了能夠像這樣使用語句,必須編寫運算子函數來執行轉換。以下就是一個將 Length 物件轉換為 double 的運算子函數:
Length::operator double() const
{
    return len_inches /12 + (len_inches %12) / 12.0;
}
該函數計算以英尺為單位的長度測量的實際十進位制等效值。例如,4 英尺 6 英寸的尺寸將被轉換為實數 4.5。

注意,函數頭中沒有指定返回型別,是因為返回型別是從運算子函數名稱中推斷出來的。另外,因為該函數是一個成員函數,所以它在呼叫物件上執行,不需要其他引數。

下面的程式演示了帶有 double 和 int 轉換運算子的 Length 類。int 運算子將只是返回 Length 物件的英寸數。
//Length2.h的內容
#ifndef _LENGTH1_H
#define _LENGTH1_H
#include <iostream>
using namespace std;

class Length
{
    private:
        int len_inches;
    public:
        Length(int feet, int inches)
        {
            setLength(feet, inches);
        }
        Length(int inches){ len_inches = inches; }
        int getFeet() const { return len_inches / 12; }
        int getInches() const { return len_inches % 12; } void setLength(int feet, int inches)
        {
            len_inches = 12 *feet + inches;
        }
        // Type conversion operators
        operator double() const;
        operator int () const { return len_inches; }
        // Overloaded stream output operator
        friend ostream &operator << (ostream &out, Length a);
};
#endif

//Length2.cpp 的內容
#include T,Length2. hn
Length::operator double() const
{
    return len_inches /12 + (len_inches %12) / 12.0;
}
ostream &operator<<(ostream& out, Length a)
{
    out << a.getFeet() << " feet, " << a.getInches() << " inches";
    return out;
}

// This program demonstrates the type conversion operators for the Length class.
#include "Length2.h"
#include <iostream>
#include <string>
using namespace std;

int main()
{
    Length distance(0);
    double feet;
    int inches;
    distance.setLength(4, 6);
    cout << "The Length object is " << distance << "." << endl;
    // Convert and print
    feet = distance;
    inches = distance;
    cout << "The Length object measures" << feet << "feet." << endl;
    cout << "The Length object measures " << inches << " inches." << endl;
    return 0;
}
程式輸出結果:

The Length object is 4 feet, 6 inches.
The Length object measures 4.5 feet.
The Length object measures 54 inches.