程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++基礎知識 >> C++運算符重載的概念和語法

C++運算符重載的概念和語法

編輯:C++基礎知識
所謂重載,就是賦予新的含義。函數重載(Function Overloading)可以讓一個函數名有多種功能,在不同情況下進行不同的操作。運算符重載(Operator Overloading)也是一個道理,同一個運算符可以有不同的功能。

實際上,我們已經在不知不覺中使用了運算符重載。例如,+號可以對不同類型(int、float 等)的數據進行加法操作;<<既是位移運算符,又可以配合 cout 向控制台輸出數據。C++ 本身已經對這些運算符進行了重載。

C++ 也允許程序員自己重載運算符,這給我們帶來了很大的便利。

下面的代碼定義了一個復數類,通過運算符重載,可以用+號實現復數的加法運算:
#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;
}
運行結果:
6.7 + 9.5i

本例中義了一個復數類 complex,m_real 表示實部,m_imag 表示虛部,第 10 行聲明了運算符重載,第 21 行進行了實現(定義)。認真觀察這兩行代碼,可以發現運算符重載的形式與函數非常類似。

運算符重載其實就是定義一個函數,在函數體內實現想要的功能,當用到該運算符時,編譯器會自動調用這個函數。也就是說,運算符重載是通過函數實現的,它本質上是函數重載。

運算符重載的格式為: 返回值類型 operator 運算符名稱 (形參表列){
    //TODO:
} operator是關鍵字,專門用於定義重載運算符的函數。我們可以將operator 運算符名稱這一部分看做函數名,對於上面的代碼,函數名就是operator+

運算符重載函數除了函數名有特定的格式,其它地方和普通函數並沒有區別。

上面的例子中,我們在 complex 類中重載了運算符+,該重載只對 complex 對象有效。當執行c3 = c1 + c2;語句時,編譯器檢測到+號左邊(+號具有左結合性,所以先檢測左邊)是一個 complex 對象,就會調用成員函數operator+(),也就是轉換為下面的形式:

c3 = c1.operator+(c2);

c1 是要調用函數的對象,c2 是函數的實參。

上面的運算符重載還可以有更加簡練的定義形式:
complex complex::operator+(const complex &A)const{
    return complex(this->m_real + A.m_real, this->m_imag + A.m_imag);
}
return 語句中的complex(this->m_real + A.m_real, this->m_imag + A.m_imag)會創建一個臨時對象,這個對象沒有名稱,是一個匿名對象。在創建臨時對象過程中調用構造函數,return 語句將該臨時對象作為函數返回值。

在全局范圍內重載運算符

運算符重載函數不僅可以作為類的成員函數,還可以作為全局函數。更改上面的代碼,在全局范圍內重載+,實現復數的加法運算:
#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;
}
運算符重載函數不是 complex 類的成員函數,但是卻用到了 complex 類的 private 成員變量,所以必須在 complex 類中將該函數聲明為友元函數。

當執行c3 = c1 + c2;語句時,編譯器檢測到+號兩邊都是 complex 對象,就會轉換為類似下面的函數調用:

c3 = operator+(c1, c2);

小結

雖然運算符重載所實現的功能完全可以用函數替代,但運算符重載使得程序的書寫更加人性化,易於閱讀。運算符被重載後,原有的功能仍然保留,沒有喪失或改變。通過運算符重載,擴大了C++已有運算符的功能,使之能用於對象。
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved