欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++超詳細講解操作符的重載

 更新時間:2022年06月01日 10:17:12   作者:清風自在 流水潺潺  
C++預(yù)定義中的運算符的操作對象只局限于基本的內(nèi)置數(shù)據(jù)類型,但是對于我們自定義的類型(類)是沒有辦法操作的。但是大多時候我們需要對我們定義的類型進行類似的運算,這個時候就需要我們對這么運算符進行重新定義,賦予其新的功能,以滿足自身的需求

一、需要解決的問題

下面的復(fù)數(shù)解決方案是否可行?

下面看一下復(fù)數(shù)的加法操作:

#include <stdio.h>
class Complex 
{
    int a;
    int b;
public:
    Complex(int a = 0, int b = 0)
    {
        this->a = a;
        this->b = b;
    }
    int getA()
    {
        return a;
    }
    int getB()
    {
        return b;
    }
    friend Complex Add(const Complex& p1, const Complex& p2);
};
Complex Add(const Complex& p1, const Complex& p2)
{
    Complex ret;
    ret.a = p1.a + p2.a;
    ret.b = p1.b + p2.b;
    return ret;
}
int main()
{
    Complex c1(1, 2);
    Complex c2(3, 4);
    Complex c3 = Add(c1, c2); // c1 + c2
    printf("c3.a = %d, c3.b = %d\n", c3.getA(), c3.getB());
    return 0;
}

輸出結(jié)果如下:

思考

Add 函數(shù)可以解決 Complex 對象相加的問題,但是 Complex 是現(xiàn)實世界中確實存在的復(fù)數(shù),并且復(fù)數(shù)在數(shù)學(xué)中的地位和普通的實數(shù)相同。

為什么不能讓+操作符也支持復(fù)數(shù)相加呢?這個就涉及到操作符的重載。

二、操作符重載

C++ 中的重載能夠擴展操作符的功能

操作符的重載以函數(shù)的方式進行

本質(zhì)

用特殊形式的函數(shù)擴展操作符的功能

  • 通過 operator 關(guān)鍵字可以定義特殊的函數(shù)
  • operator 的本質(zhì)是通過函數(shù)重載操作符

語法

下面來初探一下操作符重載:

#include <stdio.h>
class Complex 
{
    int a;
    int b;
public:
    Complex(int a = 0, int b = 0)
    {
        this->a = a;
        this->b = b;
    }
    int getA()
    {
        return a;
    }
    int getB()
    {
        return b;
    }
    friend Complex operator + (const Complex& p1, const Complex& p2);
};
Complex operator + (const Complex& p1, const Complex& p2)
{
    Complex ret;
    ret.a = p1.a + p2.a;
    ret.b = p1.b + p2.b;
    return ret;
}
int main()
{
    Complex c1(1, 2);
    Complex c2(3, 4);
    Complex c3 = c1 + c2; // operator + (c1, c2)
    printf("c3.a = %d, c3.b = %d\n", c3.getA(), c3.getB());
    return 0;
}

輸出結(jié)果如下:

可以將操作符重載函數(shù)定義為類的成員函數(shù)

  • 比全局操作符重載函數(shù)少—個參數(shù)(左操作數(shù))
  • 不需要依賴友元就可以完成操作符重載
  • 編譯器優(yōu)先在成員函數(shù)中尋找操作符重載函數(shù)

下面來實現(xiàn)在成員函數(shù)中重載操作符:

#include <stdio.h>
class Complex 
{
    int a;
    int b;
public:
    Complex(int a = 0, int b = 0)
    {
        this->a = a;
        this->b = b;
    }
    int getA()
    {
        return a;
    }
    int getB()
    {
        return b;
    }
    Complex operator + (const Complex& p)
    {
        Complex ret;
        printf("Complex operator + (const Complex& p)\n");
        ret.a = this->a + p.a;
        ret.b = this->b + p.b;
        return ret;
    }
    friend Complex operator + (const Complex& p1, const Complex& p2);
};
Complex operator + (const Complex& p1, const Complex& p2)
{
    Complex ret;
    printf("Complex operator + (const Complex& p1, const Complex& p2)\n");
    ret.a = p1.a + p2.a;
    ret.b = p1.b + p2.b;
    return ret;
}
int main()
{
    Complex c1(1, 2);
    Complex c2(3, 4);
    Complex c3 = c1 + c2; // c1.operator + (c2)
    printf("c3.a = %d, c3.b = %d\n", c3.getA(), c3.getB());
    return 0;
}

輸出結(jié)果如下:

這個說明編譯器優(yōu)先在成員函數(shù)中尋找操作符重載函數(shù)

故上述代碼可以直接寫成:

#include <stdio.h>
class Complex 
{
    int a;
    int b;
public:
    Complex(int a = 0, int b = 0)
    {
        this->a = a;
        this->b = b;
    }
    int getA()
    {
        return a;
    }
    int getB()
    {
        return b;
    }
    Complex operator + (const Complex& p)
    {
        Complex ret;
        ret.a = this->a + p.a;
        ret.b = this->b + p.b;
        return ret;
    }
};
int main()
{
    Complex c1(1, 2);
    Complex c2(3, 4);
    Complex c3 = c1 + c2; // c1.operator + (c2)
    printf("c3.a = %d, c3.b = %d\n", c3.getA(), c3.getB());
    return 0;
}

三、小結(jié)

  • 操作符重載是 C++ 的強大特性之一
  • 操作符重載的本質(zhì)是通過函數(shù)擴展操作符的功能
  • operator 關(guān)鍵字是實現(xiàn)操作符重載的關(guān)鍵
  • 操作符重載遵循相同的函數(shù)重載規(guī)則
  • 全局函數(shù)和成員函數(shù)都可以實現(xiàn)對操作符的重載

到此這篇關(guān)于C++超詳細講解操作符的重載的文章就介紹到這了,更多相關(guān)C++操作符重載內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • c++11&14-多線程要點匯總

    c++11&14-多線程要點匯總

    這篇文章主要介紹了c++11&14-多線程的使用方法,文中代碼非常詳細,方便大家更好的參考和學(xué)習,感興趣的朋友快來了解下
    2020-06-06
  • C語言實現(xiàn)統(tǒng)計100以內(nèi)所有素數(shù)的個數(shù)

    C語言實現(xiàn)統(tǒng)計100以內(nèi)所有素數(shù)的個數(shù)

    本文詳細講解了C語言實現(xiàn)統(tǒng)計100以內(nèi)所有素數(shù)個數(shù)的方法,文中通過示例代碼介紹的非常詳細。需要的朋友可以收藏下,方便下次瀏覽觀看
    2021-11-11
  • c++將字符串轉(zhuǎn)數(shù)字的實例方法

    c++將字符串轉(zhuǎn)數(shù)字的實例方法

    在本篇文章里小編給大家整理的是關(guān)于c++將字符串轉(zhuǎn)數(shù)字的實例方法,有需要的朋友們可以參考下。
    2020-02-02
  • C++?二叉樹的實現(xiàn)超詳細解析

    C++?二叉樹的實現(xiàn)超詳細解析

    二叉樹可以簡單理解為對于一個節(jié)點來說,最多擁有一個上級節(jié)點,同時最多具備左右兩個下級節(jié)點的數(shù)據(jù)結(jié)構(gòu)。本文將詳細介紹一下C++中二叉樹的實現(xiàn)和遍歷,需要的可以參考一下
    2022-03-03
  • C語言 操作符#與##使用方法詳解

    C語言 操作符#與##使用方法詳解

    在類函數(shù)宏中(帶參數(shù)的宏),#號作為一個預(yù)處理運算符,可以把記號轉(zhuǎn)換成字符串。##相當于連接符,它會將兩邊的內(nèi)容連接起來,形成新的標識符,下面請看詳細的教程
    2022-04-04
  • C語言實現(xiàn)獲取內(nèi)存信息并輸出的實例

    C語言實現(xiàn)獲取內(nèi)存信息并輸出的實例

    這篇文章主要介紹了C語言實現(xiàn)獲取內(nèi)存信息并輸出的實例的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • C語言變長數(shù)組 struct中char data[0]的用法詳解

    C語言變長數(shù)組 struct中char data[0]的用法詳解

    下面小編就為大家?guī)硪黄狢語言變長數(shù)組 struct中char data[0]的用法詳解。小編覺得挺不錯的現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • 詳解c++中的類型識別

    詳解c++中的類型識別

    這篇文章主要介紹了 詳解c++中的類型識別,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧
    2020-06-06
  • 詳解c語言實現(xiàn)的內(nèi)存池(適用于兩個線程、不加鎖、效率高)

    詳解c語言實現(xiàn)的內(nèi)存池(適用于兩個線程、不加鎖、效率高)

    這篇文章主要介紹了c語言實現(xiàn)的內(nèi)存池(適用于兩個線程、不加鎖、效率高),設(shè)計一個內(nèi)存池,要求效率比系統(tǒng)調(diào)用的效率要高(測試1萬次),同時支持一個線程申請,另外一個線程釋放,需要的朋友可以參考下
    2024-02-02
  • C++?基礎(chǔ)函數(shù)的介紹及使用(Vector+deque+STL)

    C++?基礎(chǔ)函數(shù)的介紹及使用(Vector+deque+STL)

    這篇文章主要介紹了C++?基礎(chǔ)函數(shù)的介紹及使用(Vector+deque+STL),文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-06-06

最新評論