運算符重載是通過函數實現的,它本質上是函數重載。
運算符重載其實就是定義一個函數,在函數內實現想要的功能,當用到這個運算符時,編譯器會自動調用這個函數。
#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.箭頭運算符
->
、下標運算符[]
、函數調用運算符()
、賦值運算符=
只能以成員函數的形式重載。