C++ 運算符重載(operator overloading)


運算符重載是通過函數實現的,它本質上是函數重載。

運算符重載其實就是定義一個函數,在函數內實現想要的功能,當用到這個運算符時,編譯器會自動調用這個函數。

#include <iostream>
using namespace std;
class complex{
public:
    complex();
    complex(double real, double imag);
public:
    //聲明運算符重載
    complex operator+(const complex &A) const;
    void display() const;
private:
    double m_real;  //實部
    double m_imag;  //虛部
};
complex::complex(): m_real(0.0), m_imag(0.0){ }
complex::complex(double real, double imag): m_real(real), m_imag(imag){ }
//實現運算符重載
complex complex::operator+(const complex &A) const{
    complex B;
    B.m_real = this->m_real + A.m_real;
    B.m_imag = this->m_imag + A.m_imag;
    return B;
}
void complex::display() const{
    cout<<m_real<<" + "<<m_imag<<"i"<<endl;
}
int main(){
    complex c1(4.3, 5.8);
    complex c2(2.4, 3.7);
    complex c3;
    c3 = c1 + c2;
    c3.display();
    return 0;
}

可以將operator運算符名稱這一部分看作函數名,例如operator+

在全局范圍內重載運算符

運算符重載函數不僅可以作為類的成員函數,還可以作為全局函數。

運算符重載函數不是 complex 類的成員函數,但是卻用到了 complex 類的 private 成員變量,所以必須在 complex 類中將該函數聲明為友元函數。

#include <iostream>
using namespace std;
class complex{
public:
    complex();
    complex(double real, double imag);
public:
    void display() const;
    //聲明為友元函數
    friend complex operator+(const complex &A, const complex &B);
private:
    double m_real;
    double m_imag;
};
complex operator+(const complex &A, const complex &B);
complex::complex(): m_real(0.0), m_imag(0.0){ }
complex::complex(double real, double imag): m_real(real), m_imag(imag){ }
void complex::display() const{
    cout<<m_real<<" + "<<m_imag<<"i"<<endl;
}
//在全局范圍內重載+
complex operator+(const complex &A, const complex &B){
    complex C;
    C.m_real = A.m_real + B.m_real;
    C.m_imag = A.m_imag + B.m_imag;
    return C;
}
int main(){
    complex c1(4.3, 5.8);
    complex c2(2.4, 3.7);
    complex c3;
    c3 = c1 + c2;
    c3.display();
    return 0;
}

運算符重載時要遵循的規則

1.並不是所有的運算符都可以重載。長度運算符sizeof、條件運算符:?、成員選擇符.和域解析運算符::不能被重載。

2.重載不能改變運算符的優先級和結合性。

3.重載不能改變運算符的用法,原來有幾個操作數、操作數在左邊還是在右邊,這些都不會改變。

4.運算符重載函數不能有默認的參數;否則就改變了運算符操作數的個數,這顯然是錯誤的。

5.運算符重載函數既可以作為類的成員函數,也可以作為全局函數。

6.箭頭運算符->、下標運算符[]、函數調用運算符()、賦值運算符=只能以成員函數的形式重載。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM