1. 程式人生 > >操作符重載的概念(二十四)

操作符重載的概念(二十四)

C++ 操作符重載 全局函數重載 成員函數重載

我們上節學習了操作符重載,在最後我們提出了用 + 號來實現復數的相加,但是復數是不能直接相加的。那麽我們下來來嘗試下

#include <stdio.h>

class Complex
{
    int a;
    int b;
public:
    Complex(int a = 0, int b = 0)
    {
        this->a = a;
        this->b = b;
    }
    
    int getA()
    {
        return a;
    }
    
    int getB()
    {
        return b;
    }
};

int main()
{
    Complex c1(1, 2);
    Complex c2(3, 4);
    Complex c3 = c1 + c2;
    
    printf("c3.a = %d\n", c3.getA());
    printf("c3.b = %d\n", c3.getB());
    
    return 0;
}

我們來編譯看看

技術分享圖片

它報錯了。我們就再想著在外面添加一個 add 函數,再將 Complex c3 = c1 + c2;;改為 Complex c3 = add(c1, c2); 再在類 Complex 中將它聲明為友元函數 add 函數如下

Complex add(const Complex& c1, const Complex& c2)
{
    Complex ret;
    
    ret.a = c1.a + c2.a;
    ret.b = c1.b + c2.b;
    
    return ret;
}

我們再次進行編譯,結果如下

技術分享圖片

我們看到已經編譯通過,而且運行正確。所以這個解決方案不能直接支持 + 號,那怎麽樣才能是我們之前寫的 + 號直接支持復數相加呢?這時便要用到 C++ 中的重載了,它能夠擴展操作符的功能,操作符的重載以函數的方式進行,其本質是用特殊形式的函數擴展操作符的功能。通過 operator 關鍵字可以定義特殊的函數,operator 的本質是通過函數重載操作符,語法如下所示

技術分享圖片

下面我們通過操作符重載 operator 關鍵字來重新實現下 + 號的定義。將 add 函數名改為 operator + ,然後將 Complex c3 = add(c1, c2); 改為 Complex c3 = c1 + c2;我們再次進行編譯,看看結果

技術分享圖片

我們發現已經能完美實現 + 號來支復數的相加了。但是還有個問題就是我們之前已經說過,要避免友元函數的出現。那麽這時關於操作符重載還有一些值得說的秘密就是可以將操作符重載函數定義為類的成員函數:a> 比全局操作符重載函數少一個參數(左操作數);b> 不需要依賴友元就可以完成操作符重載;c> 編譯器有限在成員函數中尋找操作符重載函數

我們再次進行試驗用以驗證

#include <stdio.h>

class Complex
{
    int a;
    int b;
public:
    Complex(int a = 0, int b = 0)
    {
        this->a = a;
        this->b = b;
    }
    
    int getA()
    {
        return a;
    }
    
    int getB()
    {
        return b;
    }
    
    Complex operator + (const Complex& c)
    {
        Complex ret;
        printf("Complex operator + (const Complex& c)\n");
        
        ret.a = this->a + c.a;
        ret.b = this->b + c.b;
        
        return ret;
    }
    
    friend Complex operator + (const Complex& c1, const Complex& c2);
};

Complex operator + (const Complex& c1, const Complex& c2)
{
    Complex ret;
    printf("Complex operator + (const Complex& c1, const Complex& c2)\n");
    
    ret.a = c1.a + c2.a;
    ret.b = c1.b + c2.b;
    
    return ret;
}

int main()
{
    Complex c1(1, 2);
    Complex c2(3, 4);
    Complex c3 = c1 + c2;
    
    printf("c3.a = %d\n", c3.getA());
    printf("c3.b = %d\n", c3.getB());
    
    return 0;
}

我們先將友元函數註釋掉,用類中的操作符重載函數進行試驗

技術分享圖片

我們看到編譯成功,並且完美運行。那麽我們將友元函數和類中的重載函數都放在那,編譯器會調用那個呢?我們看看編譯結果

技術分享圖片

我們再來看看用友元函數來實現

技術分享圖片

那麽現在已經成功實現了 + 號的操作符重載函數,支持了直接復數的相加。通過對操作符學習,總結如下:1、操作符重載是 C++ 的強大特性之一,它的本質是通過函數擴展操作符的功能;2、operator 關鍵字是實現操作符重載的關鍵;3、操作符重載遵循相同的函數重載規則;4、全局函數和成員函數都可以實現對操作符的重載。


歡迎大家一起來學習 C++ 語言,可以加我QQ:243343083

操作符重載的概念(二十四)