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

淺析C++淺拷貝與深拷貝的聯(lián)系和區(qū)別

 更新時間:2022年09月09日 14:55:57   作者:憶盅  
在c++中,深拷貝和淺拷貝也算是一個難點,特別是對于初學(xué)者來說,往往在不知道兩者區(qū)別的情況下而錯誤的使用了淺拷貝,從而導(dǎo)致了野指針之類的問題,但是又因為缺少理解所以很難定位到問題所在

文章簡述

c++中構(gòu)造函數(shù)分為三類:無參構(gòu)造、帶參構(gòu)造和拷貝構(gòu)造,其中拷貝構(gòu)造可分為默認拷貝(淺拷貝)、深拷貝,在程序中,這里我們主要講淺拷貝和深拷貝的聯(lián)系和區(qū)別。

首先,我們要明白拷貝至少需要兩個對象,并且在拷貝時,我們可以用const來保護原對象的內(nèi)容,具體用法:----- <類名>(const<類名> 對象) -----進行復(fù)制的對象 ,當我們使用棧開辟空間進行復(fù)制時,不會出現(xiàn)意外,如下:

/*===============================================
*   文件名稱:shallow_deep_copy.cpp
*   創(chuàng) 建 者:     
*   創(chuàng)建日期:
*   描    述:
================================================*/
#include <iostream>
using namespace std;
class student
{
    private:
        string name;       //--------------//
        int age;
    public:
        student()    //出現(xiàn)帶參構(gòu)造,需要默認構(gòu)造
        {
            cout << "默認構(gòu)造" << endl;
        }
        student(string m_name, int m_age)
        {
            cout << "name:" << m_name << endl << "age:" << m_age << endl;
            cout << "帶參構(gòu)造" << endl;
        }
        ~student()
        {
            cout << "析構(gòu)函數(shù)" << endl;
        }
};
void test1()
{
    student s1 = student("tom", 12);
    student s2 = s1;        //利用棧進行默認復(fù)制
}
int main()
{
    test1();        //引用函數(shù).
    return 0;
}

結(jié)果如圖:

name:tom

age:12

帶參構(gòu)造

析構(gòu)函數(shù)

析構(gòu)函數(shù)

我們可以發(fā)現(xiàn),復(fù)制后進行輸出時只有一個帶參構(gòu)造和兩個析構(gòu)函數(shù),說明了棧中系統(tǒng)自動申請又釋放了兩次空間,但是這個操作卻在自己創(chuàng)建空間(堆)時,卻是錯誤的,此時的代碼又有所不同:

/*===============================================
*   文件名稱:shallow_deep_copy.cpp
*   創(chuàng) 建 者:     
*   創(chuàng)建日期:
*   描    述:
================================================*/
#include <iostream>
using namespace std;
class student
{
    private:
        string name;
        //int age;
        int *age;    //定義指針age
    public:
        student()
        {
            cout << "默認構(gòu)造" << endl;
        }
#if 0      //------------------------------------------
        student(string m_name, int m_age)
        {
            cout << "name:" << m_name << endl << "age:" << m_age << endl;
            cout << "帶參構(gòu)造" << endl;
        }
#endif    //-------------------------------------------
        student(int m_age)
        {
            this->age = new int(m_age);
            cout << "開辟空間" << endl;
        }
        ~student()
        {   
            delete age;    //開辟使用完成,在析構(gòu)進行釋放age操作
            cout << "析構(gòu)函數(shù)" << endl;
        }
        int get_age()
        {
            return *age;
        }
};
void test1()
{
    //student s1 = student("tom", 12);
    //student s2 = s1;
    student s1(10);    //定義年齡為10,進行復(fù)制
    student s2 = s1;
}
int main()
{
    test1();       //調(diào)用函數(shù)
    return 0;
}

結(jié)果:

開辟空間

析構(gòu)函數(shù)

free(): double free detected in tcache 2

已放棄 (核心已轉(zhuǎn)儲)

這里我們只調(diào)用了*age這個參數(shù),但已經(jīng)很明顯的看到結(jié)果,錯誤信息為兩次釋放該空間,在開辟這片空間時,又進行重復(fù)釋放操作,很明顯這是系統(tǒng)所不允許的。

接下來進行深拷貝:

/*===============================================
*   文件名稱:shallow_deep_copy.cpp
*   創(chuàng) 建 者:     
*   創(chuàng)建日期:
*   描    述:
================================================*/
#include <iostream>
using namespace std;
class student
{
    private:
        string name;
        //int age;
        int *age;
    public:
        student()
        {
            cout << "默認構(gòu)造" << endl;
        }
#if 0   //--------------------------------------
        student(string m_name, int m_age)
        {
            cout << "name:" << m_name << endl << "age:" << m_age << endl;
            cout << "帶參構(gòu)造" << endl;
        }
#endif  //--------------------------------------
        student(int m_age)
        {
            this->age = new int(m_age);
            cout << "開辟空間" << endl;
        }
        //-----------深淺拷貝-------------------
        //student(const student &s)
        //{
        //    this->age = s.age;
        //    cout << "淺拷貝" << endl;
        //
        //}
        student(const student &s)
        {
            this->age = new int(*s.age); //創(chuàng)建一片新的空間進行儲存
            cout << "深拷貝" << endl;
        }
        //--------------------------------------
        ~student()
        {   
            delete age;
            cout << "析構(gòu)函數(shù)" << endl;
        }
        int get_age()
        {
            return *age;
        }
};
void test1()
{
    //student s1 = student("tom", 12);
    //student s2 = s1;
    student s1(10);
    student s2 = s1;
}
int main()
{
    test1();
    return 0;
}

開辟空間

深拷貝

析構(gòu)函數(shù)

析構(gòu)函數(shù)

此時結(jié)果為正確,這里釋放的是兩片一樣內(nèi)容但地址不一樣的空間。

到此,*我們就能總結(jié)出:淺拷貝(默認拷貝)是兩個指針申請同一片空間地址,而在釋放時,也是同一片堆內(nèi)存;深拷貝是對指針所指向的內(nèi)容進行拷貝,同時兩個指針指向的是不同空間地址,所以在釋放時需要釋放兩次。

到此這篇關(guān)于淺析C++淺拷貝與深拷貝的聯(lián)系和區(qū)別的文章就介紹到這了,更多相關(guān)C++淺拷貝與深拷貝內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言編程數(shù)據(jù)結(jié)構(gòu)帶頭雙向循環(huán)鏈表全面詳解

    C語言編程數(shù)據(jù)結(jié)構(gòu)帶頭雙向循環(huán)鏈表全面詳解

    這篇文章主要為大家介紹了C語言編程的數(shù)據(jù)結(jié)構(gòu)中帶頭雙向循環(huán)鏈表全面詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助祝大家多多進步,早日升職加薪
    2021-10-10
  • C++11 并發(fā)指南之Lock 詳解

    C++11 并發(fā)指南之Lock 詳解

    這篇文章主要介紹了C++11 并發(fā)指南之Lock 詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • C++刪除指定文件夾下N天及之前日志文件的方法

    C++刪除指定文件夾下N天及之前日志文件的方法

    這篇文章主要介紹了C++刪除指定文件夾下N天及之前日志文件的方法,涉及C++針對時間判斷及文件操作的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-09-09
  • 詳解QListWidget如何實現(xiàn)自定義Item效果

    詳解QListWidget如何實現(xiàn)自定義Item效果

    這篇文章主要為大家介紹了如何通過QListWidget實現(xiàn)自定義Item效果,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起了解一下
    2022-04-04
  • 如何為Qt視圖中的文字實現(xiàn)彩虹漸變效果

    如何為Qt視圖中的文字實現(xiàn)彩虹漸變效果

    這篇文章主要給大家介紹了關(guān)于如何為Qt視圖中的文字實現(xiàn)彩虹漸變效果的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者使用Qt具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • 基于C語言實現(xiàn)http下載器

    基于C語言實現(xiàn)http下載器

    做OTA升級功能時,我們能直接拿到的往往只是升級包的鏈接,需要我們自己去下載,這時候就需要用到http下載器。本文將利用C語言實現(xiàn)簡單的http下載器,感興趣的可以了解一下
    2022-12-12
  • 用C/C++代碼檢測ip能否ping通(配合awk和system可以做到批量檢測)

    用C/C++代碼檢測ip能否ping通(配合awk和system可以做到批量檢測)

    今天小編就為大家分享一篇關(guān)于用C/C++代碼檢測ip能否ping通(配合awk和system可以做到批量檢測),小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-04-04
  • 詳解C++標準庫中處理正則表達式的類std::regex

    詳解C++標準庫中處理正則表達式的類std::regex

    std?是?C++?標準庫的命名空間,包含了大量標準的?C++?類、函數(shù)和對象,這些類和函數(shù)提供了廣泛的功能,包括輸入輸出、容器、算法、字符串處理等,這篇文章主要介紹了C++標準庫中提供的用于處理正則表達式的類std::regex,需要的朋友可以參考下
    2024-03-03
  • 解析C語言結(jié)構(gòu)體及位段

    解析C語言結(jié)構(gòu)體及位段

    今天小編就為大家分享一篇關(guān)于解析C語言結(jié)構(gòu)體及位段,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • 淺談C++11新引入的lambda表達式

    淺談C++11新引入的lambda表達式

    Lambda表達式(又稱Lambda函數(shù),英文原文是Lambda Expression),是C++11的新特性中非常實用的一個。
    2017-07-07

最新評論

大竹县| 青河县| 凌云县| 林芝县| 弋阳县| 河曲县| 炎陵县| 天祝| 海原县| 伊春市| 长汀县| 都江堰市| 金乡县| 吴旗县| 二连浩特市| 温州市| 盱眙县| 包头市| 阿图什市| 安达市| 南宫市| 同德县| 乾安县| 西盟| 余庆县| 桑日县| 泰和县| 应用必备| 保山市| 三穗县| 桑日县| 嘉鱼县| 周口市| 灌南县| 大关县| 无锡市| 息烽县| 彰化市| 饶阳县| 开平市| 车致|