C++的重載操做符(operator)介紹

一、operator做類的轉換函數
類可使用構造函數將其餘類型轉化爲此類的對象,好比ios

my_class a = my_class(int i);
1
將int型轉化爲my_class類的一個對象。函數

一樣,也可使用類的轉換函數將類的對象轉化爲其餘的類型。 
類的轉換函數應當知足如下的幾個條件:spa

轉換函數必須是類方法
轉換函數不能指定返回類型
轉換函數不能有參數對象

下面是一個類轉化函數的例子ci

#include <iostream>get

using namespace std;編譯器

class my_class
{
public:
    operator int()//定義了一個將類轉化爲int的轉換函數
    {
        cout << "convert_to_int" << endl;
        return 1;
    }
};it

int main()
{
    my_class a;
    int i_a = (int)a;//第一次顯式的轉換
    cout << a << endl;//第二次隱式的轉換io

    return 0;
}

最終的輸出結果以下: 編譯


固然也能夠轉化爲任意其餘的類型,只須要改變轉換函數便可。

可是在定義轉化函數時,要避免出現二義性,好比不要同時提供多個符合條件的轉換函數:

#include <iostream>

using namespace std;

class my_class
{
public:
    operator double()//定義了一個將類轉化爲double的轉換函數
    {
        cout << "convert_to_double" << endl;
        return 1.1;
    }

    operator int()//定義了一個將類轉化爲int的轉換函數
    {
        cout << "convert_to_int" << endl;
        return 1;
    }
};

int main()
{
    my_class a;
    cout << a << endl;//報錯

    return 0;
}

在VS上獲得以下的報錯信息:

有多個運算符 "<<" 與這些操做數匹配
1
固然,若同時須要這兩個轉換函數,這個錯誤也能夠經過不少方法來解決,好比顯式的指定要輸出的是哪一種類型,而不是讓編譯器本身去選擇:

cout << (double)a << endl;
1
或者指定其中一個轉換函數只能顯式的轉換,而不能隱式的轉換

explicit operator double()
{
    cout << "convert_to_double" << endl;
    return 1.1;
}

都將獲得正確的結果。

二、operator在類中重載運算符
重載與類型轉換雖然使用的是同一個關鍵字,但它們在形式上仍是有很大的差異的:

類型轉換:operator <類型>()
運算符重載:<類型> operator <運算符>(<參數表>)
重載主要有兩種形式,成員函數形式與友元函數形式。下面舉個例子:

#include <iostream>

using namespace std;

class MyClass
{
public:
    MyClass() {}
    MyClass(int a, double b):a_(a),b_(b){}
    ~MyClass(){}

    int get_a() { return a_; }
    double get_b() { return b_; }

    MyClass operator+(const MyClass &adder) const//以成員函數方式重載+
    {
        MyClass sum;
        sum.a_ = a_ + adder.a_;
        sum.b_ = b_ + adder.b_;
        return sum;
    }

    friend MyClass operator-(const MyClass &A,const MyClass &B)//以友元方式重載-
    {
        MyClass diff;
        diff.a_ = A.a_ - B.a_;
        diff.b_ = A.b_ - B.b_;
        return diff;
    }

private:
    int a_;
    double b_;
};


int main()
{
    MyClass A(1, 1.1);
    MyClass B(2, 2.2);
    MyClass sum = A + B;
    MyClass diff = A - B;
    cout << sum.get_a() << "\t" << sum.get_b() << endl;
    cout << diff.get_a() << "\t" << diff.get_b() << endl;

    return 0; } 程序的運行結果: 

相關文章
相關標籤/搜索