運(yùn)算符重載

運(yùn)算符重載

運(yùn)算符重載的概念

在C++中,基本的算數(shù)運(yùn)算符,如果不做特殊處理,則 不能用于對象之間的運(yùn)算

運(yùn)算符重載的目的:使得C++中的運(yùn)算符也能夠 用來操作對象 。

用于類運(yùn)算的運(yùn)算符通常都要重載。有兩個運(yùn)算符,系統(tǒng)提供了默認(rèn)的重載版本:賦值運(yùn)算符 =地址運(yùn)算符 $

與其他函數(shù)一樣,重載運(yùn)算符有一個返回類型和一個參數(shù)列表。這樣的函數(shù)被稱為 運(yùn)算符函數(shù)

運(yùn)算符可以被重載為 全局函數(shù) ,也可以被重載為 類的成員函數(shù) 。

聲明為全局函數(shù)時,通常應(yīng)是 類的友元 。

運(yùn)算符函數(shù)是一種特殊的 友元函數(shù)全局函數(shù) 。

不可重載的運(yùn)算符和符號

名稱
成員訪問運(yùn)算符 .
成員指針訪問運(yùn)算符 . *、-> *
域運(yùn)算符 ::
長度運(yùn)算符 sizeof
條件運(yùn)算符 ?:
預(yù)處理符號 #

重載運(yùn)算符的規(guī)則

  1. 重載后的運(yùn)算符的含義應(yīng)該 符合原有的用法習(xí)慣 ;
  2. 運(yùn)算符重載 不能改變 運(yùn)算符原有的含義;
  3. 運(yùn)算符重載 不能改變 運(yùn)算符操作數(shù)的個數(shù)及語法結(jié)構(gòu);
  4. 運(yùn)算符重載 不能改變 運(yùn)算符用于基本數(shù)據(jù)類型對象的含義;
  5. 不能創(chuàng)建新的運(yùn)算符;
  6. 重載運(yùn)算符 ()[]、->= 時,只能將它們重載為 成員函數(shù) ,不能重載為全局函數(shù)。

重載運(yùn)算符為類的成員函數(shù)

定義和聲明:

class 類名
{
  private:
    類型 成員變量;
  public:
    類型 opeartor 運(yùn)算符 (參數(shù)列表);
};

類型 類名::opeartor 運(yùn)算符 (參數(shù)列表)
{
  函數(shù)體
};

運(yùn)算符執(zhí)行時,C++編譯器解析:

對象名.opeartor 運(yùn)算符 (參數(shù)列表);

重載運(yùn)算符為友元函數(shù)

定義和聲明:

class 類名
{
  private:
    類型 成員變量;
  public:
    friend 類型 opeartor 運(yùn)算符 (參數(shù)列表);
};

類型 opeartor 運(yùn)算符 (參數(shù)列表)
{
  函數(shù)體
};

運(yùn)算符執(zhí)行時,C++編譯器解析:

opeartor 運(yùn)算符 (參數(shù)列表);

重載賦值運(yùn)算符

C++規(guī)定,賦值運(yùn)算符 = 只能被重載為成員函數(shù)。

若有類CL的兩個對象s1和s2,則它們之間的賦值語句通常是下面的形式:

s1 = s2;

當(dāng)類CL重載了賦值運(yùn)算符后,則上述語句被解釋為 函數(shù)調(diào)用 的形式:

s1.opeartor=(s2);

淺拷貝和深拷貝

同類對象之間可以通過賦值運(yùn)算符 = 互相賦值。如果沒有經(jīng)過重載,= 的作用就是將賦值號右側(cè)對象的值一一賦值給左側(cè)的對象 。這相當(dāng)于值的拷貝,稱為 淺拷貝 。

重載賦值運(yùn)算符后,賦值語句的功能是將 一個對象中指針成員變量指向的內(nèi)容復(fù)制到另一個對象中指針成員變量指向的地方 ,這樣的拷貝叫做 深拷貝 。

重載流插入運(yùn)算符和流提取運(yùn)算符

必須重載為友元函數(shù) 。

#include <iostream>
using namespace std;

class Test
{
  private:
    int a;
    int b;
  public:
    friend ostream & opeartor<< (ostream &, Test);
    friend istream & opeartor>> (istream &, Test);
};

ostream & opeartor<< (ostream & o_stream, Test obj)
{
  o_stream << obj.a << endl;
  o_stream << obj.b << endl;
  return o_stream;
}

istream & opeartor>> (istream & i_stream, Test obj)
{
  i_stream >> obj.a;
  i_stream >> obj.b;
  return i_stream;
}

重載自增、自減運(yùn)算符

按照自增、自減運(yùn)算符的本來定義,++obj 的返回值應(yīng)該是 obj被修改后的值 ,而 obj++ 的返回值應(yīng)該是 obj被修改前的值 。

class 類名
{
  private:
    int i;
  public:
    // 成員函數(shù) - 前置形式
    類型 opeartor ++ ();
    // 成員函數(shù) - 后置形式
    類型 opeartor ++ (int);

    // 友元函數(shù) - 前置形式
    friend 類型 opeartor -- (類名引用);
    // 友元函數(shù) - 后置形式
    friend 類型 opeartor -- (類名引用, int);
};

類型 類名::opeartor ++ () {};
類型 類名::opeartor ++ (int) {};

類型 opeartor -- (類名引用) {};
類型 opeartor -- (類名引用, int) {};

重載強(qiáng)制類型轉(zhuǎn)換運(yùn)算符

強(qiáng)制類型轉(zhuǎn)換運(yùn)算符是單目運(yùn)算符,也可以被重載, 但只能重載為成員函數(shù) 。

class 類名
{
  private:
    類型 成員變量;
  public:
    opeartor 類型名 ();
};

經(jīng)過適當(dāng)?shù)闹剌d后,(類型名)對象; 轉(zhuǎn)換為 對象.opeartor 類型名 ();

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 運(yùn)算符重載規(guī)則 1.被重載的運(yùn)算符必須是已經(jīng)存在的C++運(yùn)算符,不能重載自己創(chuàng)建的運(yùn)算符; 2.運(yùn)算符被重載之后,...
    隨波逐流007閱讀 764評論 0 1
  • 友元 友元函數(shù) 友元函數(shù)是定義在類外部,但有權(quán)訪問類的所有私有(private)成員和保護(hù)(protected)成...
    V_夢凡閱讀 364評論 0 2
  • 基本上我們進(jìn)行運(yùn)算符重載時有兩種形式,類內(nèi)的運(yùn)算符重載和頂層函數(shù)位置的運(yùn)算符重載。 操作符重載指的是將C++提供的...
    飛揚(yáng)code閱讀 1,787評論 0 4
  • 運(yùn)算符重載使自定義類的對象能像內(nèi)置類型的變量一樣使用內(nèi)置的運(yùn)算符,擴(kuò)充運(yùn)算符的功能,增強(qiáng)了C++ 語言的可擴(kuò)充性。...
    crj1998閱讀 1,017評論 0 0
  • 為什么要對運(yùn)算符進(jìn)行重載? C++預(yù)定義中的運(yùn)算符的操作對象只局限于基本的內(nèi)置數(shù)據(jù)類型,但是對于我們自定義的類型(...
    佚戈庸人閱讀 450評論 0 0

友情鏈接更多精彩內(nèi)容