最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++類和對象之運(yùn)算符重載解讀

 更新時(shí)間:2025年05月22日 11:03:52   作者:zzh_zao  
這篇文章主要介紹了C++類和對象之運(yùn)算符重載,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

C++ 運(yùn)算符重載

一、什么是運(yùn)算符重載?

運(yùn)算符重載是 C++ 的一種特性,它允許程序員為自定義類型(如類和結(jié)構(gòu)體)重新定義運(yùn)算符的行為。通過運(yùn)算符重載,我們可以使用熟悉的運(yùn)算符語法來操作自定義類型的對象,從而使代碼更加簡潔、直觀。

當(dāng)運(yùn)算符被?于類類型的對象時(shí),C++語?允許我們通過運(yùn)算符重載的形式指定新的含義。C++規(guī)定類類型對象使?運(yùn)算符時(shí),必須轉(zhuǎn)換成調(diào)?對應(yīng)運(yùn)算符重載,若沒有對應(yīng)的運(yùn)算符重載,則會編譯報(bào)錯(cuò)。

例如,我們可以為自定義的復(fù)數(shù)類重載 + 運(yùn)算符,使得兩個(gè)復(fù)數(shù)對象可以直接使用 + 進(jìn)行相加:

Complex a(1, 2);
Complex b(3, 4);
Complex c = a + b; // 使用重載的 + 運(yùn)算符

二、運(yùn)算符重載的語法規(guī)則

在 C++ 中,運(yùn)算符重載通過定義特殊的成員函數(shù)或非成員函數(shù)來實(shí)現(xiàn)。

其基本語法如下:

返回類型 operator運(yùn)算符(參數(shù)列表) {
    // 函數(shù)體
}

其中:

  • operator 是 C++ 的關(guān)鍵字,用于聲明一個(gè)運(yùn)算符重載函數(shù)。
  • 運(yùn)算符 是要重載的運(yùn)算符,如 +, -, *, / 等。
  • 返回類型 是運(yùn)算符重載函數(shù)的返回值類型,通常與操作數(shù)的類型相關(guān)。
  • 參數(shù)列表 是運(yùn)算符重載函數(shù)的參數(shù),參數(shù)的個(gè)數(shù)和類型取決于運(yùn)算符的種類和重載方式。

注意:

  • ?個(gè)類需要重載哪些運(yùn)算符,是看哪些運(yùn)算符重載后有意義
  • 重載++運(yùn)算符時(shí),有前置++和后置++,運(yùn)算符重載函數(shù)名都是operator++,?法很好的區(qū)分。C++規(guī)定,后置++重載時(shí),增加?個(gè)int形參,跟前置++構(gòu)成函數(shù)重載,?便區(qū)分。
  • 當(dāng)運(yùn)算符被?于類類型的對象時(shí),C++語?允許我們通過運(yùn)算符重載的形式指定新的含義。C++規(guī)定類類型對象使?運(yùn)算符時(shí),必須轉(zhuǎn)換成調(diào)?對應(yīng)運(yùn)算符重載,若沒有對應(yīng)的運(yùn)算符重載,則會編譯報(bào)錯(cuò)。
  • 運(yùn)算符重載是具有特殊名字的函數(shù),他的名字是由operator和后?要定義的運(yùn)算符共同構(gòu)成。和其他函數(shù)?樣,它也具有其返回類型和參數(shù)列表以及函數(shù)體。
  • 重載運(yùn)算符函數(shù)的參數(shù)個(gè)數(shù)和該運(yùn)算符作?的運(yùn)算對象數(shù)量?樣多。?元運(yùn)算符有?個(gè)參數(shù),?元運(yùn)算符有兩個(gè)參數(shù),?元運(yùn)算符的左側(cè)運(yùn)算對象傳給第?個(gè)參數(shù),右側(cè)運(yùn)算對象傳給第?個(gè)參數(shù)。
  • 如果?個(gè)重載運(yùn)算符函數(shù)是成員函數(shù),則它的第?個(gè)運(yùn)算對象默認(rèn)傳給隱式的this指針,因此運(yùn)算符重載作為成員函數(shù)時(shí),參數(shù)?運(yùn)算對象少?個(gè)。
  • 運(yùn)算符重載以后,其優(yōu)先級和結(jié)合性與對應(yīng)的內(nèi)置類型運(yùn)算符保持?致。
  • 不能通過連接語法中沒有的符號來創(chuàng)建新的操作符:?如operator@。

重載<<和>>時(shí),需要重載為全局函數(shù),因?yàn)橹剌d為成員函數(shù),this指針默認(rèn)搶占了第?個(gè)形參位置,第?個(gè)形參位置是左側(cè)運(yùn)算對象,調(diào)?時(shí)就變成了 對象<<cout,不符合使?習(xí)慣和可讀性。

重載為全局函數(shù)把ostream/istream放到第?個(gè)形參位置就可以了,第?個(gè)形參位置當(dāng)類類型對象。

成員函數(shù)重載

運(yùn)算符重載函數(shù)可以作為類的成員函數(shù)來定義。在這種情況下,函數(shù)的參數(shù)個(gè)數(shù)比運(yùn)算符的操作數(shù)少一個(gè),因?yàn)榈谝粋€(gè)操作數(shù)是通過 this 指針隱式傳遞的。

非成員函數(shù)重載

運(yùn)算符重載函數(shù)也可以作為非成員函數(shù)(全局函數(shù)或友元函數(shù))來定義。

在這種情況下,函數(shù)的參數(shù)個(gè)數(shù)與運(yùn)算符的操作數(shù)相同。

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

賦值運(yùn)算符重載是?個(gè)默認(rèn)成員函數(shù),?于完成兩個(gè)已經(jīng)存在的對象直接的拷?賦值,這?要注意跟拷?構(gòu)造區(qū)分,拷?構(gòu)造?于?個(gè)對象拷?初始化給另?個(gè)要?jiǎng)?chuàng)建的對象。

賦值運(yùn)算符重載的特點(diǎn):

  • 賦值運(yùn)算符重載是?個(gè)運(yùn)算符重載,規(guī)定必須重載為成員函數(shù)。賦值運(yùn)算重載的參數(shù)建議寫成const當(dāng)前類類型引?,否則會傳值傳參會有拷?
  • 有返回值,且建議寫成當(dāng)前類類型引?,引?返回可以提?效率,有返回值?的是為了?持連續(xù)賦值場景。
  • 沒有顯式實(shí)現(xiàn)時(shí),編譯器會?動?成?個(gè)默認(rèn)賦值運(yùn)算符重載,默認(rèn)賦值運(yùn)算符重載?為跟默認(rèn)拷?構(gòu)造函數(shù)類似,對內(nèi)置類型成員變量會完成值拷?/淺拷?(?個(gè)字節(jié)?個(gè)字節(jié)的拷?),對?定義類型成員變量會調(diào)?他的賦值重載函數(shù)。

拷貝構(gòu)造:一個(gè)存在的對象去初始化另一個(gè)要實(shí)例化的對象; 賦值重載:已存在的兩個(gè)對象之間的拷貝,注意返回值為類類型,處理連續(xù)賦值的情況

取地址運(yùn)算符重載

const成員函數(shù)

  • 將const修飾的成員函數(shù)稱之為const成員函數(shù),const修飾成員函數(shù)放到成員函數(shù)參數(shù)列表的后?。
  • const實(shí)際修飾該成員函數(shù)隱含的this指針,表明在該成員函數(shù)中不能對類的任何成員進(jìn)?修改。Date* const this 變?yōu)?const Date* const this

取地址運(yùn)算符重載

  • 取地址運(yùn)算符重載分為普通取地址運(yùn)算符重載和const取地址運(yùn)算符重載,?般這兩個(gè)函數(shù)編譯器?動?成的就可以夠我們?了,不需要去顯?實(shí)現(xiàn)。
  • 除??些很特殊的場景,?如我們不想讓別?取到當(dāng)前類對象的地址,就可以??實(shí)現(xiàn)?份,胡亂返回?個(gè)地址。

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

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

C++ 中大部分運(yùn)算符都可以被重載,包括:

  • 算術(shù)運(yùn)算符:+, -, *, /, %, ++, --
  • 比較運(yùn)算符:==, !=, <, >, <=, >=
  • 邏輯運(yùn)算符:&&, ||, !
  • 位運(yùn)算符:&, |, ^, ~, <<, >>
  • 賦值運(yùn)算符:=, +=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=
  • 其他運(yùn)算符:[], (), ->, ,, *(解引用), &(取地址)

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

C++ 中少數(shù)運(yùn)算符不能被重載,包括:

  • 作用域解析運(yùn)算符:::
  • 成員訪問運(yùn)算符:..*
  • 條件運(yùn)算符:?:
  • 類型轉(zhuǎn)換運(yùn)算符:typeiddynamic_cast
  • 編譯時(shí)運(yùn)算符:sizeof

五、運(yùn)算符重載的注意事項(xiàng)

在使用運(yùn)算符重載時(shí),需要注意以下幾點(diǎn):

  • 遵循運(yùn)算符的原有語義:運(yùn)算符重載應(yīng)該保持運(yùn)算符原有的語義,避免造成混淆。例如,重載 + 運(yùn)算符應(yīng)該實(shí)現(xiàn)加法的語義,而不是減法。
  • 不要濫用運(yùn)算符重載:雖然運(yùn)算符重載可以使代碼更加簡潔,但過度使用或?yàn)E用會使代碼變得難以理解和維護(hù)。
  • 保持運(yùn)算符的優(yōu)先級和結(jié)合性:運(yùn)算符重載不能改變運(yùn)算符的優(yōu)先級和結(jié)合性,這是由語言規(guī)定的。
  • 正確處理 const 對象:如果運(yùn)算符重載函數(shù)不修改對象的狀態(tài),應(yīng)該將其聲明為 const 成員函數(shù)。
  • 注意內(nèi)存管理:在重載賦值運(yùn)算符和拷貝構(gòu)造函數(shù)時(shí),需要特別注意深拷貝和淺拷貝的問題,避免內(nèi)存泄漏。
  • 避免創(chuàng)建新的運(yùn)算符:C++ 不允許創(chuàng)建新的運(yùn)算符,只能重載已有的運(yùn)算符。

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 用C語言實(shí)現(xiàn)五子棋小游戲

    用C語言實(shí)現(xiàn)五子棋小游戲

    這篇文章主要為大家詳細(xì)介紹了用C語言實(shí)現(xiàn)五子棋小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • C++實(shí)現(xiàn)通訊錄小功能

    C++實(shí)現(xiàn)通訊錄小功能

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)通訊錄小功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • 基于C++編寫一個(gè)進(jìn)度條的示例代碼

    基于C++編寫一個(gè)進(jìn)度條的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何利用C++實(shí)現(xiàn)一個(gè)命令行進(jìn)度條,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解一下
    2023-06-06
  • C++基礎(chǔ)入門篇之強(qiáng)制轉(zhuǎn)換

    C++基礎(chǔ)入門篇之強(qiáng)制轉(zhuǎn)換

    這篇文章主要給大家介紹了關(guān)于C++基礎(chǔ)入門篇之強(qiáng)制轉(zhuǎn)換的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • OpenCV c++滑動條的創(chuàng)建和使用代碼

    OpenCV c++滑動條的創(chuàng)建和使用代碼

    滾動條(Trackbar)在OpenCV中是非常方便的交互工具,它依附于特定的窗口而存在,下面這篇文章主要給大家介紹了關(guān)于OpenCV?c++滑動條的創(chuàng)建和使用的相關(guān)資料,需要的朋友可以參考下
    2023-06-06
  • CentOS下Jsoncpp安裝配置的方法

    CentOS下Jsoncpp安裝配置的方法

    本文主要介紹了CentOS下Jsoncpp安裝配置的方法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • C++堆棧類模板實(shí)現(xiàn)代碼

    C++堆棧類模板實(shí)現(xiàn)代碼

    這篇文章主要為大家詳細(xì)介紹了C++堆棧類模板的實(shí)現(xiàn)代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • C++中sting類的簡單實(shí)現(xiàn)方法

    C++中sting類的簡單實(shí)現(xiàn)方法

    這篇文章主要介紹了C++中sting類的簡單實(shí)現(xiàn)方法的相關(guān)資料,需要的朋友可以參考下
    2016-08-08
  • 詳解VS2019 dumpbin查看DLL的導(dǎo)出函數(shù)

    詳解VS2019 dumpbin查看DLL的導(dǎo)出函數(shù)

    這篇文章主要介紹了詳解VS2019 dumpbin查看DLL的導(dǎo)出函數(shù),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • C/C++函數(shù)調(diào)用的幾種方式總結(jié)

    C/C++函數(shù)調(diào)用的幾種方式總結(jié)

    本篇文章主要是對C/C++函數(shù)調(diào)用的幾種方式進(jìn)行了詳細(xì)的總結(jié)介紹,需要的朋友可以過來參考下,希望對大家有所幫助
    2013-12-12

最新評論

临漳县| 武功县| 德昌县| 诏安县| 镇沅| 浙江省| 赞皇县| 防城港市| 闽侯县| 湘西| 长垣县| 岳池县| 怀化市| 武安市| 枣阳市| 汪清县| 沭阳县| 宜良县| 普兰县| 衡阳县| 饶河县| 息烽县| 保靖县| 泾阳县| 柏乡县| 西吉县| 临清市| 丹巴县| 石泉县| 文昌市| 永修县| 鄢陵县| 库车县| 万全县| 漳州市| 兰州市| 武胜县| 兴隆县| 云安县| 新蔡县| 贡山|