中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++編程語言中賦值運算符重載函數怎么使用

發布時間:2022-06-10 11:48:51 來源:億速云 閱讀:127 作者:iii 欄目:開發技術

本文小編為大家詳細介紹“C++編程語言中賦值運算符重載函數怎么使用”,內容詳細,步驟清晰,細節處理妥當,希望這篇“C++編程語言中賦值運算符重載函數怎么使用”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。

1 概述

1.1 Why

首先介紹為什么要對賦值運算符“=”進行重載。某些情況下,當我們編寫一個類的時候,并不需要為該類重載“=”運算符,因為編譯系統為每個類提供了默認的賦值運算符“=”,使用這個默認的賦值運算符操作類對象時,該運算符會把這個類的所有數據成員都進行一次賦值操作。例如有如下類:

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

對這個類的對象進行賦值時,使用默認的賦值運算符是沒有問題的。

示例代碼內容如下:

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

編譯并執行上述代碼,結果如下:

C++編程語言中賦值運算符重載函數怎么使用

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

但是,在下面的示例中,使用編譯系統提供的默認賦值運算符,就會出現問題了。

示例代碼內容如下:

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

編譯并運行上述代碼,結果如下:

C++編程語言中賦值運算符重載函數怎么使用

上述錯誤信息表明:當對象 obj1 和 obj2 進行析構時,由于重復釋放了同一塊內存空間,導致程序崩潰報錯。在這種情況下,就需要我們重載賦值運算符“=”了。

2 示例代碼

2.1 示例代碼1

我們修改一下前面出錯的示例代碼,編寫一個包含賦值運算符重載函數的類,修改后的代碼內容如下:

#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;
    }
    // 賦值運算符重載函數
    ClassA& operator=(const ClassA& cls)
    {
        // 避免自賦值
        if (this != &cls)
        {
            // 避免內存泄露
            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;
}

編譯并運行上述代碼,結果如下:

C++編程語言中賦值運算符重載函數怎么使用

通過上述結果能夠看到,利用賦值運算符重載函數,解決了對象賦值時,析構函數多次釋放同一塊內存空間的問題。

對于上述代碼,有以下幾點需要說明:

當為一個類的對象賦值(可以用本類對象為其賦值,也可以用其它類型的值為其賦值)時,該對象(如本例的 obj2)會調用該類的賦值運算符重載函數,進行具體的賦值操作。如上述代碼中的“obj2 = obj1;”語句,用 obj1 為 obj2 賦值,則會由 obj2 調用 ClassA 類的賦值運算符重載函數;

下方語句和語句“ClassA obj2 = obj1;”在調用函數上是有區別的:前者第一句是對象 obj2 的聲明及定義,調用類 ClassA 的無參構造函數,所以“obj2 = obj1;”一句是在對象 obj2 已經存在的情況下,用 obj1 來為 obj2 賦值,調用的是賦值運算符重載函數;而后者,是用 obj1 來初始化 obj2,調用的是拷貝構造函數。拷貝構造函數的語句樣式為“ClassA(const ClassA& cls)”,關于拷貝構造函數的詳細內容,請參考相關內容,此處不展開介紹;

ClassA obj2;
obj2 = obj1;

當程序沒有顯式地提供一個以“本類或本類的引用”為參數的賦值運算符重載函數時,編譯器會自動生成一個默認的賦值運算符重載函數(即默認賦值運算符)。

2.2 示例代碼2

示例代碼內容如下:

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

編譯并執行上述代碼,結果如下:

C++編程語言中賦值運算符重載函數怎么使用

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

如果將上述代碼中賦值運算符重載函數去掉,重新編譯執行,結果如下:

C++編程語言中賦值運算符重載函數怎么使用

上述結果說明,當用一個非類 A 的值(如上面的 int 類型值)為類 A 的對象賦值時:

  • 如果檢測到構造函數和賦值運算符重載函數同時存在,則會優先調用賦值運算符重載函數;

  • 如果只檢測到構造函數,就會調用構造函數。

讀到這里,這篇“C++編程語言中賦值運算符重載函數怎么使用”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

西昌市| 苏州市| 抚远县| 碌曲县| 泰来县| 敖汉旗| 瓦房店市| 香港| 平泉县| 松原市| 家居| 卢氏县| 新安县| 铜鼓县| 内丘县| 崇州市| 桐庐县| 九龙坡区| 泰顺县| 余庆县| 塘沽区| 建宁县| 陕西省| 赣州市| 博白县| 元氏县| 彰武县| 中山市| 北海市| 莱州市| 安阳市| 吉安县| 辽阳市| 朝阳区| 那坡县| 辰溪县| 安阳县| 叶城县| 施秉县| 兰溪市| 福贡县|