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

C++簡(jiǎn)明圖解分析淺拷貝與深拷貝

 更新時(shí)間:2022年06月02日 10:17:37   作者:Bright-SKY  
在c++中,深拷貝和淺拷貝也算是一個(gè)難點(diǎn),特別是對(duì)于初學(xué)者來說,往往在不知道兩者區(qū)別的情況下而錯(cuò)誤的使用了淺拷貝,從而導(dǎo)致了野指針之類的問題,但是又因?yàn)槿鄙倮斫馑院茈y定位到問題所在

類中有指針成員 才會(huì)討論 淺拷貝 和深拷貝問題。

淺拷貝(單純值拷貝)

#include <iostream>
#include <string.h>
#include <stdlib.h>
using namespace std;
class Person
{
public:
    char *m_name;
public:
    Person(char *name)
    {
        cout<<"有參構(gòu)造"<<endl;
        m_name = (char *)calloc(1,strlen(name)+1);
        if(m_name == NULL)
        {
            cout<<"空間申請(qǐng)失敗"<<endl;
            exit(-1);
        }
        strcpy(m_name, name);
    }
    ~Person()
    {
        cout<<"析構(gòu)函數(shù)"<<endl;
        //釋放指針成員 指向的堆區(qū)空間
        if(m_name != NULL)
        {
            free(m_name);
            m_name = NULL;
        }
        cout<<"-----001------"<<endl;
    }
};
int main(int argc, char *argv[])
{
    Person ob1("lucy");
    Person ob2 = ob1;//拷貝構(gòu)造(默認(rèn)是淺拷貝)
    cout<<"ob2.m_name = "<<ob2.m_name<<endl;
    return 0;
}

深拷貝

必須在拷貝構(gòu)造中給ob2.m_name申請(qǐng)空間

#include <iostream>
#include <string.h>
#include <stdlib.h>
using namespace std;
class Person
{
public:
    char *m_name;
public:
    Person(char *name)
    {
        cout<<"有參構(gòu)造"<<endl;
        m_name = (char *)calloc(1,strlen(name)+1);
        if(m_name == NULL)
        {
            cout<<"空間申請(qǐng)失敗"<<endl;
            exit(-1);
        }
        strcpy(m_name, name);
    }
    Person(const Person &ob)
    {
        cout<<"拷貝構(gòu)造函數(shù)(深拷貝)"<<endl;
        m_name = (char *)calloc(1, strlen(ob.m_name)+1);
        if(m_name == NULL)
        {
            cout<<"空間申請(qǐng)失敗"<<endl;
            exit(-1);
        }
        strcpy(m_name, ob.m_name);
    }
    ~Person()
    {
        cout<<"析構(gòu)函數(shù)"<<endl;
        //釋放指針成員 指向的堆區(qū)空間
        if(m_name != NULL)
        {
            free(m_name);
            m_name = NULL;
        }
    }
};
int main(int argc, char *argv[])
{
    Person ob1("lucy");
    Person ob2 = ob1;//拷貝構(gòu)造
    cout<<"ob2.m_name = "<<ob2.m_name<<endl;
    return 0;
}

總結(jié)

1、如果類中的成員 指向了堆區(qū)空間 一定要記得在析構(gòu)函數(shù)中 釋放該空間

2、如果用戶 不實(shí)現(xiàn) 拷貝構(gòu)造 系統(tǒng)就會(huì)提供默認(rèn)拷貝構(gòu)造,而默認(rèn)拷貝構(gòu)造 只是單純的賦值 容易造成淺拷貝問題

3、用戶記得 要實(shí)現(xiàn):無參構(gòu)造(初始化數(shù)據(jù))、有參構(gòu)造(賦參數(shù))、拷貝構(gòu)造(深拷貝) 、析構(gòu)函數(shù)(釋放空間)

拷貝構(gòu)造函數(shù)的調(diào)用時(shí)機(jī)

拷貝構(gòu)造函數(shù)調(diào)用的時(shí)機(jī):舊對(duì)象 給新對(duì)象 初始化

class Data
{
public:
    Data()
    {
        cout<<"無參構(gòu)造"<<endl;
    }
    Data(const Data &ob)
    {
        cout<<"拷貝構(gòu)造"<<endl;
    }
    ~Data()
    {
        cout<<"析夠函數(shù)"<<endl;
    }
};

情形1:舊對(duì)象給新對(duì)象初始化

Data ob1;
Data ob2 = ob1;//調(diào)用拷貝構(gòu)造

情形2:普通對(duì)象作為函數(shù)的參數(shù)

void fun01(Data ob)//Data ob=ob1  發(fā)生拷貝構(gòu)造
{
}
int main(int argc, char *argv[])
{
    Data ob1;
    fun01(ob1);
    return 0;
}

情形3:普通對(duì)象 作為函數(shù)的返回值

#include <iostream>
using namespace std;
Data fun01(void)
{
    Data ob1;
    return ob1;
}
int main(int argc, char *argv[])
{
    Data ob = fun01();
    return 0;
}

vs下會(huì)發(fā)生拷貝構(gòu)造:

Qt、linux不會(huì)發(fā)生拷貝:

到此這篇關(guān)于C++簡(jiǎn)明圖解分析淺拷貝與深拷貝的文章就介紹到這了,更多相關(guān)C++淺拷貝與深拷貝內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言實(shí)現(xiàn)簡(jiǎn)單三子棋小游戲

    C語言實(shí)現(xiàn)簡(jiǎn)單三子棋小游戲

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)簡(jiǎn)單三子棋小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • C語言實(shí)現(xiàn)小小圣誕樹源代碼

    C語言實(shí)現(xiàn)小小圣誕樹源代碼

    圣誕節(jié)當(dāng)然要有個(gè)圣誕樹了,今天給你們用C語言編寫一個(gè)雪夜圣誕樹,這篇文章主要給大家介紹了關(guān)于C語言實(shí)現(xiàn)小小圣誕樹的相關(guān)資料,需要的朋友可以參考下
    2023-12-12
  • C++中平衡二叉搜索樹的模擬實(shí)現(xiàn)

    C++中平衡二叉搜索樹的模擬實(shí)現(xiàn)

    二叉搜索樹雖可以縮短查找的效率,但如果數(shù)據(jù)有序或接近有序二叉搜索樹將退化為單支樹,查找元素相當(dāng)于在順序表中搜索元素,效率低下,所以本文給大家介紹了C++平衡二叉的搜索樹模擬實(shí)現(xiàn)方法,需要的朋友可以參考下
    2023-09-09
  • C++中Stack(棧)的使用方法與基本操作詳解

    C++中Stack(棧)的使用方法與基本操作詳解

    Stack是一種常見的數(shù)據(jù)結(jié)構(gòu),常常被用來解決遞歸問題、括號(hào)匹配問題、函數(shù)調(diào)用棧等等。本文將介紹C++中stack的使用方法及基本操作,需要的可以參考一下
    2023-05-05
  • 基于C語言實(shí)現(xiàn)個(gè)人通訊錄管理系統(tǒng)

    基于C語言實(shí)現(xiàn)個(gè)人通訊錄管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了基于C語言實(shí)現(xiàn)個(gè)人通訊錄管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-06-06
  • C++智能指針shared_ptr

    C++智能指針shared_ptr

    這篇文章主要介紹了C++智能指針shared_ptr,C++11中包括shared_ptr在內(nèi)的多種指針,都是模板類型,意味著使用者可以指定想要操作的類型下文從shared_ptr創(chuàng)建方式展開全文,介紹詳細(xì)具有一的參考價(jià)值,需要的小伙伴可以參考一下
    2022-03-03
  • C++實(shí)現(xiàn)學(xué)生選課系統(tǒng)的思路與詳細(xì)過程

    C++實(shí)現(xiàn)學(xué)生選課系統(tǒng)的思路與詳細(xì)過程

    C語言是在國(guó)內(nèi)外廣泛使用的一種計(jì)算機(jī)語言,下面這篇文章主要給大家介紹了關(guān)于C++實(shí)現(xiàn)學(xué)生選課系統(tǒng)的思路與詳細(xì)過程,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-01-01
  • C++ 獲取URL內(nèi)容的實(shí)例

    C++ 獲取URL內(nèi)容的實(shí)例

    這篇文章主要介紹了C++ 獲取URL內(nèi)容的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • OpenCV實(shí)現(xiàn)繪制輪廓外接矩形

    OpenCV實(shí)現(xiàn)繪制輪廓外接矩形

    這篇文章主要為大家詳細(xì)介紹了OpenCV實(shí)現(xiàn)繪制輪廓外接矩形的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-12-12
  • C指針原理教程之垃圾回收-內(nèi)存泄露

    C指針原理教程之垃圾回收-內(nèi)存泄露

    C語言沒有運(yùn)行時(shí)庫,無法自動(dòng)壓縮使用中的內(nèi)存,縮小堆棧所需內(nèi)存空間。若只申請(qǐng)內(nèi)存,沒有釋放,勢(shì)必造成系統(tǒng)內(nèi)存不斷減少、丟失。長(zhǎng)時(shí)間的運(yùn)行,最終導(dǎo)致系統(tǒng)死機(jī)。文章闡述了C語言垃圾產(chǎn)生的原因,并從引用計(jì)數(shù)、標(biāo)記一清除算法兩方面提出如何實(shí)現(xiàn)C語言的垃圾回收。
    2019-02-02

最新評(píng)論

常宁市| 龙泉市| 上虞市| 镇赉县| 黄龙县| 壶关县| 文山县| 葵青区| 长子县| 来凤县| 浑源县| 牟定县| 兴隆县| 宿迁市| 武乡县| 大冶市| 松江区| 泽州县| 丁青县| 浙江省| 连南| 垣曲县| 芜湖市| 龙川县| 银川市| 辰溪县| 竹溪县| 外汇| 黄陵县| 明星| 定安县| 青铜峡市| 湟中县| 邵阳县| 甘孜县| 封开县| 乐业县| 宁陕县| 湖口县| 陵川县| 布拖县|