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

C++編程語言中賦值運(yùn)算符重載函數(shù)(operator=)的使用

 更新時(shí)間:2022年06月10日 10:02:25   作者:liitdar  
本文主要介紹了C++編程語言中賦值運(yùn)算符重載函數(shù)(operator=)介紹,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

本文主要介紹 C++ 編程語言中賦值運(yùn)算符重載函數(shù)(operator=)的相關(guān)知識(shí),同時(shí)通過示例代碼介紹賦值運(yùn)算符重載函數(shù)的使用方法。

1 概述

1.1 Why

首先介紹為什么要對賦值運(yùn)算符“=”進(jìn)行重載。某些情況下,當(dāng)我們編寫一個(gè)類的時(shí)候,并不需要為該類重載“=”運(yùn)算符,因?yàn)榫幾g系統(tǒng)為每個(gè)類提供了默認(rèn)的賦值運(yùn)算符“=”,使用這個(gè)默認(rèn)的賦值運(yùn)算符操作類對象時(shí),該運(yùn)算符會(huì)把這個(gè)類的所有數(shù)據(jù)成員都進(jìn)行一次賦值操作。例如有如下類:

class A
{
public:
    int a;
    int b;
    int c;
};

對這個(gè)類的對象進(jìn)行賦值時(shí),使用默認(rèn)的賦值運(yùn)算符是沒有問題的。

示例代碼內(nèi)容如下:

#include <iostream>
 
using namespace std;
 
class ClassA
{
public:
    int a;
    int b;
    int c;
};
 
int main()
{
    ClassA obj1;
    obj1.a = 1;
    obj1.b = 2;
    obj1.c = 3;
 
    ClassA obj2;
    obj2 = obj1;
 
    cout << "obj2.a is: " << obj2.a << endl;
 
    return 0;
}
 

編譯并執(zhí)行上述代碼,結(jié)果如下:

通過上述結(jié)果能夠知道:通過使用系統(tǒng)默認(rèn)的賦值運(yùn)算符“=”,可以讓對象 obj2 中的所有數(shù)據(jù)成員的值與對象 obj1 相同。這種情況下,編譯系統(tǒng)提供的默認(rèn)賦值運(yùn)算符可以正常使用。

但是,在下面的示例中,使用編譯系統(tǒng)提供的默認(rèn)賦值運(yùn)算符,就會(huì)出現(xiàn)問題了。

示例代碼內(nèi)容如下:

#include <iostream>
#include <string.h>
 
using namespace std;
 
class ClassA
{
public:
    ClassA()
    {
    
    }
 
    ClassA(const char* pszInputStr)
    {
        pszTestStr = new char[strlen(pszInputStr) + 1];
        strncpy(pszTestStr, pszInputStr, strlen(pszInputStr) + 1);
    }
    virtual ~ClassA()
    {
        delete pszTestStr;
    }
public:
    char* pszTestStr;
};
 
int main()
{
    ClassA obj1("liitdar");
 
    ClassA obj2;
    obj2 = obj1;
 
    cout << "obj2.pszTestStr is: " << obj2.pszTestStr << endl;
    cout << "addr(obj1.pszTestStr) is: " << &obj1.pszTestStr << endl;
    cout << "addr(obj2.pszTestStr) is: " << &obj2.pszTestStr << endl;
 
    return 0;
}

編譯并運(yùn)行上述代碼,結(jié)果如下:

上述錯(cuò)誤信息表明:當(dāng)對象 obj1 和 obj2 進(jìn)行析構(gòu)時(shí),由于重復(fù)釋放了同一塊內(nèi)存空間,導(dǎo)致程序崩潰報(bào)錯(cuò)。在這種情況下,就需要我們重載賦值運(yùn)算符“=”了。

2 示例代碼

2.1 示例代碼1

我們修改一下前面出錯(cuò)的示例代碼,編寫一個(gè)包含賦值運(yùn)算符重載函數(shù)的類,修改后的代碼內(nèi)容如下:

#include <iostream>
#include <string.h>
 
using namespace std;
 
class ClassA
{
public:
    ClassA()
    {
    
    }
    ClassA(const char* pszInputStr)
    {
        pszTestStr = new char[strlen(pszInputStr) + 1];
        strncpy(pszTestStr, pszInputStr, strlen(pszInputStr) + 1);
    }
    virtual ~ClassA()
    {
        delete pszTestStr;
    }
    // 賦值運(yùn)算符重載函數(shù)
    ClassA& operator=(const ClassA& cls)
    {
        // 避免自賦值
        if (this != &cls)
        {
            // 避免內(nèi)存泄露
            if (pszTestStr != NULL)
            {
                delete pszTestStr;
                pszTestStr = NULL;
            }
 
            pszTestStr = new char[strlen(cls.pszTestStr) + 1];
            strncpy(pszTestStr, cls.pszTestStr, strlen(cls.pszTestStr) + 1);
        }
        
        return *this;
    }
    
public:
    char* pszTestStr;
};
 
int main()
{
    ClassA obj1("liitdar");
 
    ClassA obj2;
    obj2 = obj1;
 
    cout << "obj2.pszTestStr is: " << obj2.pszTestStr << endl;
    cout << "addr(obj1.pszTestStr) is: " << &obj1.pszTestStr << endl;
    cout << "addr(obj2.pszTestStr) is: " << &obj2.pszTestStr << endl;
 
    return 0;
}
 

編譯并運(yùn)行上述代碼,結(jié)果如下:

通過上述結(jié)果能夠看到,利用賦值運(yùn)算符重載函數(shù),解決了對象賦值時(shí),析構(gòu)函數(shù)多次釋放同一塊內(nèi)存空間的問題。

對于上述代碼,有以下幾點(diǎn)需要說明:

當(dāng)為一個(gè)類的對象賦值(可以用本類對象為其賦值,也可以用其它類型的值為其賦值)時(shí),該對象(如本例的 obj2)會(huì)調(diào)用該類的賦值運(yùn)算符重載函數(shù),進(jìn)行具體的賦值操作。如上述代碼中的“obj2 = obj1;”語句,用 obj1 為 obj2 賦值,則會(huì)由 obj2 調(diào)用 ClassA 類的賦值運(yùn)算符重載函數(shù);

下方語句和語句“ClassA obj2 = obj1;”在調(diào)用函數(shù)上是有區(qū)別的:前者第一句是對象 obj2 的聲明及定義,調(diào)用類 ClassA 的無參構(gòu)造函數(shù),所以“obj2 = obj1;”一句是在對象 obj2 已經(jīng)存在的情況下,用 obj1 來為 obj2 賦值,調(diào)用的是賦值運(yùn)算符重載函數(shù);而后者,是用 obj1 來初始化 obj2,調(diào)用的是拷貝構(gòu)造函數(shù)??截悩?gòu)造函數(shù)的語句樣式為“ClassA(const ClassA& cls)”,關(guān)于拷貝構(gòu)造函數(shù)的詳細(xì)內(nèi)容,請參考相關(guān)內(nèi)容,此處不展開介紹;

ClassA obj2;
obj2 = obj1;

當(dāng)程序沒有顯式地提供一個(gè)以“本類或本類的引用”為參數(shù)的賦值運(yùn)算符重載函數(shù)時(shí),編譯器會(huì)自動(dòng)生成一個(gè)默認(rèn)的賦值運(yùn)算符重載函數(shù)(即默認(rèn)賦值運(yùn)算符)。

2.2 示例代碼2

示例代碼內(nèi)容如下:

#include<iostream>
#include<string>
 
using namespace std;
 
class Data
{
private:
    int data;
    
public:
    // 構(gòu)造函數(shù)
    Data()
    {
    };
    // 構(gòu)造函數(shù)
    Data(int _data):data(_data)
    {
        cout << "This is constructor" << endl;
    }
    // 賦值運(yùn)算符重載函數(shù)
    Data& operator=(const int _data)
    {
        cout << "This is operator=(int _data)" << endl;
        data = _data;
        
        return *this;
    }
};
 
int main()
{
    // 調(diào)用構(gòu)造函數(shù)
    Data data1(1);
    Data data2, data3;
    // 調(diào)用賦值運(yùn)算符重載函數(shù)
    data2 = 1;
    // 調(diào)用默認(rèn)的賦值運(yùn)算符重載函數(shù)
    data3 = data2;
    
    return 0;
}

編譯并執(zhí)行上述代碼,結(jié)果如下:

上述結(jié)果表明:“data2 = 1;”語句調(diào)用了我們提供的以 int 型參數(shù)(而非本類或本類的引用)為形參的賦值運(yùn)算符重載函數(shù);而“data3 = data2;”的成功執(zhí)行,說明該語句調(diào)用了編譯器提供的默認(rèn)的賦值運(yùn)算符重載函數(shù)。

如果將上述代碼中賦值運(yùn)算符重載函數(shù)去掉,重新編譯執(zhí)行,結(jié)果如下:

上述結(jié)果說明,當(dāng)用一個(gè)非類 A 的值(如上面的 int 類型值)為類 A 的對象賦值時(shí):

  • 如果檢測到構(gòu)造函數(shù)和賦值運(yùn)算符重載函數(shù)同時(shí)存在,則會(huì)優(yōu)先調(diào)用賦值運(yùn)算符重載函數(shù);
  • 如果只檢測到構(gòu)造函數(shù),就會(huì)調(diào)用構(gòu)造函數(shù)。

3 總結(jié)

綜合本文內(nèi)容,可以知道針對以下情況,需要顯式地提供賦值運(yùn)算符重載函數(shù)(即自定義賦值運(yùn)算符重載函數(shù)):

  • 用非類 A 類型的值為類 A 的對象賦值時(shí)(當(dāng)然,這種情況下我們也可以不提供相應(yīng)的賦值運(yùn)算符重載函數(shù),而只提供相應(yīng)的構(gòu)造函數(shù),如更改后的示例代碼2);
  • 用類 A 類型的值為類 A 的對象賦值,且類 A 的數(shù)據(jù)成員中含有指針的情況下,必須顯式提供賦值運(yùn)算符重載函數(shù)(如示例代碼1)。

到此這篇關(guān)于C++編程語言中賦值運(yùn)算符重載函數(shù)(operator=)介紹的文章就介紹到這了,更多相關(guān)C++ 賦值運(yùn)算符重載函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言制作貪吃蛇小游戲

    C語言制作貪吃蛇小游戲

    這篇文章主要為大家詳細(xì)介紹了C語言制作貪吃蛇小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • C語言變長數(shù)組使用詳解

    C語言變長數(shù)組使用詳解

    這篇文章主要介紹了C語言變長數(shù)組使用詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • java實(shí)現(xiàn)任意四則運(yùn)算表達(dá)式求值算法

    java實(shí)現(xiàn)任意四則運(yùn)算表達(dá)式求值算法

    這篇文章主要介紹了java實(shí)現(xiàn)任意四則運(yùn)算表達(dá)式求值算法,實(shí)例分析了基于java實(shí)現(xiàn)表達(dá)式四則運(yùn)算求值的原理與技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-04-04
  • VS2022連接sqlserver數(shù)據(jù)庫教程

    VS2022連接sqlserver數(shù)據(jù)庫教程

    本文主要介紹了VS2022連接sqlserver數(shù)據(jù)庫教程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • 內(nèi)部排序之堆排序的實(shí)現(xiàn)詳解

    內(nèi)部排序之堆排序的實(shí)現(xiàn)詳解

    本篇文章是對堆排序的實(shí)現(xiàn)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C語言中的指針以及二級(jí)指針代碼詳解

    C語言中的指針以及二級(jí)指針代碼詳解

    這篇文章主要介紹了C語言中的指針以及二級(jí)指針代碼詳解,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • C++關(guān)于/2和>>1的區(qū)別說明

    C++關(guān)于/2和>>1的區(qū)別說明

    這篇文章主要介紹了C++關(guān)于/2和>>1的區(qū)別說明,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • c++文件監(jiān)控之FileSystemWatcher

    c++文件監(jiān)控之FileSystemWatcher

    為了監(jiān)控web程序的靜態(tài)文件是否被惡意改動(dòng),所以學(xué)習(xí)了一下FileSystemWatcher 類對文件的監(jiān)控,由于還在初級(jí)階段,這里只貼一下關(guān)于FileSystemWatcher學(xué)習(xí)的一些代碼
    2019-04-04
  • C++ Boost Spirit入門教程

    C++ Boost Spirit入門教程

    Boost是為C++語言標(biāo)準(zhǔn)庫提供擴(kuò)展的一些C++程序庫的總稱。Boost庫是一個(gè)可移植、提供源代碼的C++庫,作為標(biāo)準(zhǔn)庫的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開發(fā)引擎之一,是為C++語言標(biāo)準(zhǔn)庫提供擴(kuò)展的一些C++程序庫的總稱
    2022-11-11
  • C語言中隨機(jī)數(shù)rand()函數(shù)詳解

    C語言中隨機(jī)數(shù)rand()函數(shù)詳解

    大家好,本篇文章主要講的是C語言中隨機(jī)數(shù)rand()函數(shù)詳解,感興趣的同學(xué)感快來看一看吧,對你有幫助的話記得收藏一下
    2022-02-02

最新評(píng)論

扶风县| 仪征市| 关岭| 开阳县| 莱阳市| 贡嘎县| 磴口县| 永城市| 恭城| 房产| 平谷区| 河北区| 郎溪县| 繁昌县| 惠安县| 浦东新区| 分宜县| 临邑县| 扶风县| 宜宾市| 湘潭县| 临安市| 赞皇县| 潼关县| 濮阳县| 平乐县| 兴义市| 新泰市| 吉首市| 冕宁县| 嵊州市| 泾源县| 宁化县| 武功县| 来凤县| 壶关县| 什邡市| 灌南县| 兴安县| 武清区| 霞浦县|