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

詳解C++中賦值,關(guān)系,函數(shù)調(diào)用運(yùn)算符重載的實現(xiàn)

 更新時間:2022年06月13日 10:03:43   作者:葉落秋白  
本文主要為大家講解一下三個C++中的運(yùn)算符重載,分別是賦值運(yùn)算符重載、關(guān)系運(yùn)算符重載和函數(shù)調(diào)用運(yùn)算符重載,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

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

在C++中基本數(shù)據(jù)類型例如整型,可以實現(xiàn)連續(xù)賦值:a=b=c;而我們的對象的成員屬性雖然可以相等,但是如果牽扯到堆地址,就會有深淺拷貝的問題存在。所以我們自己重載賦值運(yùn)算符,實現(xiàn)連等的方法。

類結(jié)構(gòu)

class Info
{
    int* m_a;
public:
    Info()
    {
        m_a = NULL;
    }
    Info(int a)
    {
        m_a = new int(a);
    }
    ~Info()
    {
        if (m_a != NULL)
            delete m_a;
        m_a = NULL;
    }
    
};

創(chuàng)建一個Info類,定義指針屬性*m_a, 然后自己定義Info類的無參、有參構(gòu)造函數(shù)和析構(gòu)函數(shù),再給屬性賦值的時候,是用new關(guān)鍵字開辟堆區(qū)并存放數(shù)據(jù);析構(gòu)在前面的文章中講到了他的作用,就是在程序結(jié)束前編譯器自動調(diào)用析構(gòu)來完成對象的清理工作,在這里就會把堆區(qū)的數(shù)據(jù)釋放掉。

問題的出現(xiàn)

Info f(20);
Info f1;
Info f2;
Info f3(30);
f1 = f2 =f;

直接連等是不行的,因為在析構(gòu)函數(shù)里訪問了一個NULL地址,就比如程序即將結(jié)束,f調(diào)用析構(gòu)函數(shù),刪除m_a指向的地址,然而f1也會調(diào)用析構(gòu)函數(shù),由于f1和f的m_a指向同一個地址,那就好重復(fù)訪問,訪問一個被刪除的地址肯定會報錯的;因此我們需要對賦值運(yùn)算符進(jìn)行重載,這里提示一下,連等就相當(dāng)于鏈?zhǔn)秸{(diào)用,因此重載運(yùn)算符的返回值類型需要返回引用。

具體實現(xiàn)

Info& operator=(Info& f)
    {
        if (m_a != NULL)
            delete m_a;
        m_a = NULL;
        m_a = new int(*f.m_a);
        return *this;
    }

返回值類型是類引用,這樣可以做到鏈?zhǔn)秸{(diào)用 ,函數(shù)名還是統(tǒng)一的operator+運(yùn)算符,既然是賦值運(yùn)算符就用operator=,然后這個重載發(fā)生在成員內(nèi)部,因此參數(shù)里只需要傳入用來賦值的對象即可,注意倒數(shù)第二行代碼,我利用new讓m_a指向堆區(qū)中新開辟的地址,這是賦值運(yùn)算符重載的關(guān)鍵;就是因為把地址指向了堆區(qū)的新地址,這樣不同的對象在調(diào)用析構(gòu)函數(shù)的時候各刪各的堆地址,不會訪問空地址,這個問題的解決和深淺拷貝的解決方式一樣,都是自己寫方法來避免原來方法中成員屬性指向同一個地址。最后返回自身的引用,就可以實現(xiàn)連續(xù)調(diào)用了。

關(guān)系運(yùn)算符重載

關(guān)系運(yùn)算符有“大于”、“小于”、“等于”、“大于等于”、“不等于”等幾種情況,我就舉例等于和不等于兩種賦值運(yùn)算符重載的例子

類結(jié)構(gòu)

class Info
{
    friend void test1();
    int* m_a;
    string m_name;
public:
    Info()
    {
        m_a = NULL;
    }
    Info(int a,string name)
    {
        m_a = new int(a);
        m_name = name;
    }
    ~Info()
    {
        if (m_a != NULL)
            delete m_a;
        m_a = NULL;
    }
}

這里的類結(jié)構(gòu)相比于賦值運(yùn)算符重載多了一個String類型的m_name屬性,然后寫出類的無參、有參構(gòu)造和析構(gòu)函數(shù),最上面的friend關(guān)鍵字是加了一個友元的聲明,讓下面的test1函數(shù)可以訪問類的私有屬性。

具體實現(xiàn)

    bool operator==(Info& f)
    {
        if (*this->m_a == *f.m_a && m_name==f.m_name)
            return true;
        else return false;
    }
    bool operator!=(Info& f)
    {
        if (*this->m_a == *f.m_a && m_name == f.m_name)
            return false;
        else return true;
    }

返回值類型寫成布爾類型,因為關(guān)系運(yùn)算的結(jié)果就是布爾類型的,常和while循環(huán)以及if語句使用;函數(shù)名還是老樣子,operator==和operator!=,分別是相等和不等;既然是成員內(nèi)部的關(guān)系運(yùn)算符重載,那么形參傳入一個待比較對象即可。

調(diào)用方法

void test1()
{
    Info f1(20,"張三");
    Info f3(30,"張六");
    if (f1== f3) cout << "二者相等" << endl;
    else if (f1!= f3) cout << "二者不相等" << endl;
}

運(yùn)行效果 

函數(shù)調(diào)用運(yùn)算符重載

函數(shù)調(diào)用使用“()”,函數(shù)調(diào)用也是可以重載的,而且重載的調(diào)用很像直接調(diào)用函數(shù),因此也叫做仿函數(shù)。

類結(jié)構(gòu)

class MyHello
{
public:
    string hello;
};

非常簡單的類結(jié)構(gòu),只有一個公有權(quán)限下的String類型的hello屬性。

具體實現(xiàn)

    void operator()(string s)
    {
        cout << s << endl;
    }

因為只是打印一下,不需要返回值,函數(shù)名不多說了,和前面類似,然后傳入字符串類型再方法里打印出來。

調(diào)用方法 

void test()
{
    MyHello hello;
    hello("Hello World");
}

首先創(chuàng)建類對象hello,直接使用重載后的調(diào)用方法:對象+(字符串);這樣就能打印出引號里的內(nèi)容了:

匿名對象調(diào)用

最后補(bǔ)充一個匿名對象的知識,示例:

class MyAdd
{
public:
    int operator()(int num1, int num2)
    {
        return num1 + num2;
    }
};
void test1()
{
    MyAdd myAdd;
    int num = myAdd(160, 40);
    cout << "ret =" << myAdd(160,40) << endl;
    cout << "ret =" << MyAdd()(100,50) << endl;
}

這里我寫了一個只有重載函數(shù)調(diào)用函數(shù)的類,并在test1中用常規(guī)和匿名對象調(diào)用重載后的函數(shù)調(diào)用方法;看一下運(yùn)行效果:

先創(chuàng)建對象,再通過對象調(diào)用函數(shù)的方法我們不感到奇怪,但是最后一個輸出語句中,MyAdd()(100,50)是什么意思呢 ,這就是匿名對象,往后我們遇到形如類名+()再+調(diào)用函數(shù)的方式,那就是創(chuàng)建了匿名對象,其特點(diǎn)就是創(chuàng)建完畢后就會刪除,這里我們只都一下數(shù)據(jù),所以適合匿名對象的調(diào)用。

總結(jié)

到這里C++的運(yùn)算符重載徹底結(jié)束了,運(yùn)算符重載可以多個都重載并互相配合使用,把對象的屬性可以和基本類型一樣進(jìn)行算數(shù)運(yùn)算和邏輯運(yùn)算,在類對象比較多的時候可以節(jié)省很多時間,簡化程序。

以上就是詳解C++中賦值,關(guān)系,函數(shù)調(diào)用運(yùn)算符重載的實現(xiàn)的詳細(xì)內(nèi)容,更多關(guān)于C++運(yùn)算符重載的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 判斷兩顆二叉樹是否相似的兩種方法

    判斷兩顆二叉樹是否相似的兩種方法

    今天小編就為大家分享一篇關(guān)于判斷兩顆二叉樹是否相似的兩種方法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • Qt實現(xiàn)自定義日志類的示例代碼

    Qt實現(xiàn)自定義日志類的示例代碼

    這篇文章主要為大家詳細(xì)介紹了使用 qInstallMessageHandler() 實現(xiàn)一個簡單的日志工具,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以學(xué)習(xí)一下
    2023-12-12
  • 如何在二叉樹中找出和為某一值的所有路徑

    如何在二叉樹中找出和為某一值的所有路徑

    本篇文章是對在二叉樹中找出和為某一值的所有路徑方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • Qt利用QChart實現(xiàn)實時波形圖的繪制

    Qt利用QChart實現(xiàn)實時波形圖的繪制

    這篇文章主要介紹了Qt如何利用QChart實現(xiàn)實時波形圖的繪制,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)有一定是參考價值,需要的可以參考一下
    2022-06-06
  • QT利用QPainter繪制三維餅狀圖

    QT利用QPainter繪制三維餅狀圖

    這篇文章主要為大家詳細(xì)介紹了如何利用QPainter實現(xiàn)三維餅狀圖的繪制,由于Qt中沒有三維餅狀圖的繪制組件,因此只能自行繪制,感興趣的可以動手嘗試一下
    2022-06-06
  • Qt+Quick實現(xiàn)圖片演示器的開發(fā)

    Qt+Quick實現(xiàn)圖片演示器的開發(fā)

    這篇文章主要為大家詳細(xì)介紹了Qt如何利用Quick實現(xiàn)圖片演示器的開發(fā),文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Qt有一定的幫助,需要的可以參考一下
    2023-01-01
  • c++回調(diào)之利用sink示例

    c++回調(diào)之利用sink示例

    Sink的本質(zhì)是利用C++的封裝、繼承、多態(tài)的面向?qū)ο髞韺崿F(xiàn),從實現(xiàn)角度來說,更優(yōu)于函數(shù)指針回調(diào),下面是示例
    2014-04-04
  • C語言實例講解四大循環(huán)語句的使用

    C語言實例講解四大循環(huán)語句的使用

    C語言有四大循環(huán)語句,他們之間可以進(jìn)行任意轉(zhuǎn)換。本文將首先對其語法進(jìn)行講解,然后通過一個實例用四種循環(huán)來實現(xiàn)。相信通過本文的學(xué)習(xí),大家都能夠?qū)語言循環(huán)語句有著熟練的掌握
    2022-05-05
  • C++超詳細(xì)分析單鏈表的實現(xiàn)與常見接口

    C++超詳細(xì)分析單鏈表的實現(xiàn)與常見接口

    鏈表是一種物理存儲結(jié)構(gòu)上非連續(xù)、非順序的存儲結(jié)構(gòu),數(shù)據(jù)元素的邏輯順序是通過鏈表中的指針鏈接次序?qū)崿F(xiàn)的,本章帶你分析單鏈表的實現(xiàn)與常見接口
    2022-03-03
  • C++中DeviceIoCteatol的用法實例

    C++中DeviceIoCteatol的用法實例

    這篇文章主要介紹了C++中DeviceIoCteatol的用法實例,對于學(xué)習(xí)C++針對硬件的操作有一定的參考借鑒價值,需要的朋友可以參考下
    2014-10-10

最新評論