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

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

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

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

在C++中基本數(shù)據(jù)類型例如整型,可以實(shí)現(xiàn)連續(xù)賦值:a=b=c;而我們的對象的成員屬性雖然可以相等,但是如果牽扯到堆地址,就會(huì)有深淺拷貝的問題存在。所以我們自己重載賦值運(yùn)算符,實(shí)現(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)建一個(gè)Info類,定義指針屬性*m_a, 然后自己定義Info類的無參、有參構(gòu)造函數(shù)和析構(gòu)函數(shù),再給屬性賦值的時(shí)候,是用new關(guān)鍵字開辟堆區(qū)并存放數(shù)據(jù);析構(gòu)在前面的文章中講到了他的作用,就是在程序結(jié)束前編譯器自動(dòng)調(diào)用析構(gòu)來完成對象的清理工作,在這里就會(huì)把堆區(qū)的數(shù)據(jù)釋放掉。

問題的出現(xiàn)

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

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

具體實(shí)現(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=,然后這個(gè)重載發(fā)生在成員內(nèi)部,因此參數(shù)里只需要傳入用來賦值的對象即可,注意倒數(shù)第二行代碼,我利用new讓m_a指向堆區(qū)中新開辟的地址,這是賦值運(yùn)算符重載的關(guān)鍵;就是因?yàn)榘训刂分赶蛄硕褏^(qū)的新地址,這樣不同的對象在調(diào)用析構(gòu)函數(shù)的時(shí)候各刪各的堆地址,不會(huì)訪問空地址,這個(gè)問題的解決和深淺拷貝的解決方式一樣,都是自己寫方法來避免原來方法中成員屬性指向同一個(gè)地址。最后返回自身的引用,就可以實(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)算符重載多了一個(gè)String類型的m_name屬性,然后寫出類的無參、有參構(gòu)造和析構(gòu)函數(shù),最上面的friend關(guān)鍵字是加了一個(gè)友元的聲明,讓下面的test1函數(shù)可以訪問類的私有屬性。

具體實(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;
    }

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

調(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),只有一個(gè)公有權(quán)限下的String類型的hello屬性。

具體實(shí)現(xiàn)

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

因?yàn)橹皇谴蛴∫幌?,不需要返回值,函?shù)名不多說了,和前面類似,然后傳入字符串類型再方法里打印出來。

調(diào)用方法 

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

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

匿名對象調(diào)用

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

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;
}

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

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

總結(jié)

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

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

相關(guān)文章

  • 分享C++面試中string類的一種正確寫法

    分享C++面試中string類的一種正確寫法

    C++ 的一個(gè)常見面試題是讓你實(shí)現(xiàn)一個(gè) String 類,限于時(shí)間,不可能要求具備 std::string 的功能,但至少要求能正確管理資源
    2013-11-11
  • Qt?QString的使用實(shí)現(xiàn)

    Qt?QString的使用實(shí)現(xiàn)

    本文主要介紹了Qt?QString的使用實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • 關(guān)于C/C++中static關(guān)鍵字的作用總結(jié)

    關(guān)于C/C++中static關(guān)鍵字的作用總結(jié)

    以下是對C/C++中static關(guān)鍵字的作用進(jìn)行了總結(jié)介紹,需要的朋友可以過來參考下
    2013-09-09
  • c++ 開發(fā)中如何讀寫yaml配置文件

    c++ 開發(fā)中如何讀寫yaml配置文件

    這篇文章主要介紹了c++ 開發(fā)中如何讀寫yaml配置文件,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-04-04
  • 在QT中遍歷QStringList的五種常用方法

    在QT中遍歷QStringList的五種常用方法

    本文總結(jié)了Qt中遍歷QStringList的五種常用方法及其適用場景:基于范圍的for循環(huán)(簡潔現(xiàn)代)、foreach宏(Qt傳統(tǒng))、索引循環(huán)(需索引操作)、STL風(fēng)格迭代器(高效靈活)和Java風(fēng)格迭代器(雙向遍歷),通過代碼示例詳細(xì)說明了每種方法的語法特點(diǎn)和使用技巧
    2026-01-01
  • C++中四種對象生存期和作用域以及static的用法總結(jié)分析

    C++中四種對象生存期和作用域以及static的用法總結(jié)分析

    以下是對C++中四種對象生存期和作用域以及static的用法進(jìn)行了詳細(xì)的介紹,需要的朋友可以過來參考下
    2013-09-09
  • C/C++運(yùn)用WMI接口實(shí)現(xiàn)查詢系統(tǒng)信息

    C/C++運(yùn)用WMI接口實(shí)現(xiàn)查詢系統(tǒng)信息

    Windows?Management?Instrumentation(WMI)是一種用于管理和監(jiān)視Windows操作系統(tǒng)的框架,本文主要介紹了如何運(yùn)用WMI接口實(shí)現(xiàn)查詢系統(tǒng)信息,感興趣的可以了解下
    2023-11-11
  • C語言實(shí)現(xiàn)哈夫曼樹

    C語言實(shí)現(xiàn)哈夫曼樹

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)哈夫曼樹,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • C調(diào)用C++代碼的方法步驟

    C調(diào)用C++代碼的方法步驟

    本文主要介紹了C調(diào)用C++代碼的方法步驟,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • 淺析C語言調(diào)試器GDB和LLDB的使用方法

    淺析C語言調(diào)試器GDB和LLDB的使用方法

    這篇文章主要介紹了C語言調(diào)試器GDB和LLDB的使用方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-12-12

最新評論

绥宁县| 望奎县| 沙河市| 宣恩县| 安塞县| 百色市| 河津市| 宾川县| 巴彦淖尔市| 同江市| 秦皇岛市| 嘉祥县| 华阴市| 天门市| 菏泽市| 太和县| 石屏县| 苍南县| 吴堡县| 台北市| 赫章县| 永善县| 马公市| 将乐县| 京山县| 南岸区| 沙雅县| 萨迦县| 会宁县| 聊城市| 东莞市| 大田县| 承德市| 拜城县| 墨脱县| 西充县| 庄河市| 西贡区| 封开县| 定兴县| 游戏|