中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++運算符重載怎么定義和使用

發布時間:2023-04-18 11:42:27 來源:億速云 閱讀:121 作者:iii 欄目:開發技術

這篇文章主要介紹“C++運算符重載怎么定義和使用”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“C++運算符重載怎么定義和使用”文章能幫助大家解決問題。

1、運算符重載定義

正常來說,我們一般使用的運算符是對基本的數據類型進行操作,但是在C++中有了對象,導致對象無法通過運算符進行運算,故引入了運算符重載即需要重新的定義這些運算符,賦予已有運算符新的功能,使它能夠用于特定類型執行特定的操作。運算符重載的實質是函數重載,它提供了C++的可擴展性。

運算符重載是通過創建運算符函數實現的,運算符函數定義了重載的運算符將要進行的操作。運算符函數的定義與其他函數的定義類似,唯一的區別是運算符函數的函數名是由關鍵字operator和其后要重載的運算符符號構成的。運算符函數定義的一般格式如下:

<返回類型說明符> operator <運算符符號>(<參數表>)
{
      <函數體>
}

其中,“返回類型說明符”指出重載運算符的返回值類型,operator是定義運算符重載函數的關鍵字,“運算符符號”指出要重載的運算符名字,是C++中可重載的運算符,比如要重載加法運算符,這里直接寫“+”即可,“參數表”指出重載運算符所需要的參數及其類型。可以看出,運算符重載是一種形式C++多態的體現。

例如,使用“+”將兩個對象相加,編譯器將根據操作數的數目和類型決定使用哪種加法定義,這樣可以讓代碼看起來更加自然。

//正常情況下兩個數組的數相加
for(int i= 0; i<10; i++)
    c[i] = a[i] + b[i];
//可以通過定義一個數組的類,重載“+”運算符后
//隱藏了內部機制,并強調了實質
arry operator+(arry p,arry q)
{
   arry t;
    for(int i= 0; i<10; i++)  //c = a + b;
    {
      t.a[i]=p.a[i]+q.a[i];
    }
    return t;
}

運算符重載就是對已有的運算符重新進行定義,賦予其另一種功能,以達到適應不同的數據類型。運算符重載不能改變它本來的寓意(也就是加法不能變更為減法),運算符重載只是一種 “語法上的方便” ,它只是一種函數調用的方式。

2、作為成員函數進行重載

我們就以“+”運算符重載舉例:

#include <iostream>
using namespace std;
class addfloat
{
public:
    addfloat(float p);
    //聲明運算符重載
    addfloat operator+(const addfloat &A) const;
    void show() const;
private:
    float m_p;
};
addfloat::addfloat(float p)
{
    m_p = p;
}
//作為類的成員函數實現運算符重載
addfloat addfloat::operator+(const addfloat &A) const
{
    addfloat B;
    B.m_p = this->m_p + A.m_p;
    return B;
}
void addfloat::show() const
{
    cout<<"輸出結果是"<<m_p<<endl;
}


int main()
{
    addfloat m(5.1);
    addfloat n(1.5);
    addfloat t;
    t = m + n; //兩個addfloat類對象相加:t = m.operator+(n);
    t.show();
    return 0;
}

運行結果為:

輸出結果是6.6

從上面的例子可以看出,在addfloat類中對“+”運算符進行了重載 ,重載后可以對該類的對象進行加法運算。當運行 t = m + n時,編譯器檢測到“+”左邊的m(“+”具有左結合性,所以先檢測左邊)是一個 addfloat類對象,就會調用成員函數 operator+(),將表達式轉換成如下格式:

t = m.operator + (n);

表達式中m作為調用函數的對象,n作為函數的實參。

3、作為全局函數進行重載

對于之前的例子:t = m + n,m和n是作為addfloat類的對象進行相加的,使用成員函數 operator+()轉換為了t = m.operator+(n),如果n不是類的對象,而是一個常數,例如:

t = m + 5.2;那么可以轉換t = m.operator+(5.2);

但是如果m是一個常數時,即:t = 5.2 + n;則t = (5.2).operator + (n)這種轉換是不允許的,編譯器會報錯,因為5.2不能作為類的對象調用運算符重載operator+()函數。

這種場景下針對“+”這種運算符作為類的成員函數進行重載是不可以的。運算符重載不僅僅可以通過類的成員函數來實現,也可以通過全局函數來實現。

我們需要將運算符重載的全局函數聲明為友元函數,因為大多數時候重載運算符要訪問類的私有數據,(當然也可以設置為非友元非類的成員函數,但是非友元又不是類的成員函數,是沒有辦法直接訪問類的私有數據的),如果不聲明為類的友元函數,而是通過在此函數中調用類的公有函數來訪問私有數據會降低性能。所以一般都會設置為類的友元函數,這樣我們就可以在此非成員函數中訪問類中的數據了。

#include <iostream>
using namespace std;
class addfloat
{
public:
    addfloat(float p);
    //聲明為友元函數
    friend addfloat operator+(const addfloat &A, const addfloat &B);
    void show() const;
private:
    float m_p;
};
addfloat::addfloat(float p)
{
    m_p = p;
}

void addfloat::show() const
{
    cout<<"輸出結果是"<<m_p<<endl;
}

//作為全局函數進行重載
addfloat operator+(const addfloat &A, const addfloat &B)
{
    addfloat C;
    C.m_p = A.m_p + B.m_p;
    return C;
}

int main()
{
    addfloat m(5.1);
    addfloat n(1.5);
    addfloat t;
    t = m + n; //兩個addfloat類對象相加:t = m.operator+(n);
    t.show();
    return 0;
}

由上述程序可以看出,運算符重載函數operator+()不是 addfloat類的成員函數,但是卻用到了 addfloat類的 private 成員變量m_p,所以需要在 addfloat類中將operator+()函數聲明為友元函數。

當運行t = m + n時,編譯器檢測到“+”兩邊都是addfloat類的對象,就會轉換為類似下面的函數調用:

t = operator + (m, n);

因此,m和n都可以看作是函數的實參:

t = m + 5.2轉換為 t = operator + (m, 5.2);

t = 5.2 + n轉換為 t = operator + (5.2, n);

以全局函數的形式重載“+”,是為了保證“+”運算符的操作數能夠被對稱的處理;換句話說,常數在“+”左邊和右邊都是正確的;

因此,運算符左右兩邊都有操作對象時,且這兩個操作對象可以互換,最好可以使用全局函數的形式重載,例如:+、-、*、/、==、!= ,這些符合運算符兩邊有操作對象的運算符。

4、運算符重載的一些規則

(1)可以重載的運算符

C++運算符重載怎么定義和使用

(2)不可以重載的運算符

.         (成員訪問運算符)

.*       (成員指針訪問運算符)

::        (域運算符)

sizeof (長度運算符)

?:        (條件運算符)

(3) 只能以成員函數的形式重載的運算符(與 this關聯太多)

=         (賦值運算符)

()         (函數調用運算符)

[]         (下標運算符)

->       (成員訪問運算符)

(4)只能以全局函數重載的運算符

<<      (左移運算符)

>>      (右移運算符)

(5)運算符重載函數既可以作為類的成員函數,也可以作為全局函數。友元函數運算符重載函數與成員運算符重載函數的區別是:友元函數沒有this指針,而成員函數有,因此,在兩個操作數的重載中友元函數有兩個參數,而成員函數只有一個。

(6)有一部分運算符重載既可以是成員函數也可以是全局函數,雖然沒有一個必然的、不可抗拒的理由選擇成員函數,但我們應該優先考慮成員函數,這樣更符合運算符重載的初衷。

(7)對于復合的賦值運算符如 +=、-=、*=、/=、&=、!=、~=、%=、>>=、<<= 建議重載為成員函數;

單目運算符最好重載為成員函數;

對于其它運算符,建議重載為全局函數。

(8)使用運算符不能違反運算符原來的語法規則,原來有幾個操作數、操作數在左邊還是在右邊,這些都不會改變。算符重載函數不能有默認的參數,否則就改變了運算符操作數的個數。

(9)運算符的優先級不能被重載改變。然而,圓括號能夠強制改變表達式中重載運算符的求值順序。

(10)運算符的結合性不能被重載改變。如果一個運算符的結合性是從左向右,那么,它的所有重載的版本的結合性依然是從左向右

(11)不能創造新的運算符,即只能重載現有的運算符。例如不能定義operator** (&middot;&middot;&middot;)來表示求冪。

(12)重載的運算符必須和用戶定義的對象一起使用,運算符參數(操作的對象)中至少應有一個是類對象(或類對象的引用)。

關于“C++運算符重載怎么定義和使用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

西青区| 台南县| 南江县| 古浪县| 罗平县| 大港区| 营山县| 宝山区| 上栗县| 天祝| 绥德县| 陆良县| 漯河市| 科技| 广昌县| 吉林市| 平塘县| 广河县| 兰溪市| 宁阳县| 嵩明县| 高阳县| 新巴尔虎左旗| 怀集县| 衡山县| 昭通市| 桐梓县| 新竹市| 司法| 抚顺县| 盘山县| 时尚| 包头市| 四平市| 民丰县| 淅川县| 仪征市| 广河县| 延吉市| 大石桥市| 绥阳县|