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

C++面向?qū)ο缶幊讨鰳?gòu)詳解

 更新時間:2022年03月17日 10:27:14   作者:charlee44  
這篇文章主要為大家詳細介紹了C++面向?qū)ο缶幊讨鰳?gòu),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

1. 概述

類的析構(gòu)函數(shù)執(zhí)行與構(gòu)造函數(shù)相反的操作,當對象結(jié)束其生命周期,程序就會自動執(zhí)行析構(gòu)函數(shù):

class ImageEx
{
public:
    ImageEx()
    {
        cout << "Execute the constructor!" << endl;
    }
    ~ImageEx()
    {
        cout << "Execute the destructor!" << endl;
    }
};
int main()
{
    ImageEx imageEx;
    return 0;
}

那么同樣的問題來了,為什么要有析構(gòu)函數(shù)呢?

2. 詳論

2.1. 對象生命周期

在經(jīng)典C++中,需要通過new/delete來手動管理動態(tài)內(nèi)存。如果我們在類中申請一個動態(tài)數(shù)組,并且通過自定義的函數(shù)Release()來釋放它:

class ImageEx
{
public:
    ImageEx()
    {
        cout << "Execute the constructor!" << endl;
        data = new unsigned char[10];
    }
    ~ImageEx()
    {
        cout << "Execute the destructor!" << endl;
    }
    void Release()
    {
        delete[] data;
        data = nullptr;
    }
private:
    unsigned char * data;
};
int main()
{
    {
        ImageEx imageEx;
        imageEx.Release();
    }
    return 0;
}

那么,當類對象離開作用域,結(jié)束生命周期之前,就必須顯示調(diào)用一次成員函數(shù)Release(),否則就會造成內(nèi)存泄漏:對象在調(diào)用析構(gòu)函數(shù)之后,只會銷毀數(shù)據(jù)成員data本身,而不是其指向的內(nèi)存。

那么,一個合理的實現(xiàn)是,將成員函數(shù)Release()放入到析構(gòu)函數(shù):

class ImageEx
{
public:
    ImageEx()
    {
        cout << "Execute the constructor!" << endl;
        data = new unsigned char[10];
    }
    ~ImageEx()
    {
        Release();
        cout << "Execute the destructor!" << endl;
    }
private:
    unsigned char * data;
    void Release()
    {
        delete[] data;
        data = nullptr;
    }
};
int main()
{
    {
        ImageEx imageEx;       
    }
    return 0;
}

這樣,當類對象離開作用域,結(jié)束生命周期之前,就自動通過析構(gòu)函數(shù),實現(xiàn)了動態(tài)數(shù)組的釋放。好處是顯而易見的:實現(xiàn)了類似于內(nèi)置數(shù)據(jù)類型對象的生命周期管理,我們可以像使用內(nèi)置數(shù)據(jù)類型對象一樣使用類對象。

2.2. 不一定需要顯式析構(gòu)

在一些現(xiàn)代高級編程語言(C#、Java、Javascript)中,已經(jīng)不用去手動管理動態(tài)內(nèi)存,取而代之的,是其與操作系統(tǒng)的中間件(.net,jvm,瀏覽器)的GC(垃圾回收)機制。而在現(xiàn)代C++中,提倡通過智能指針(std::shared_ptr、std::unique_ptr、std::weak_ptr)來管理動態(tài)內(nèi)存;對于動態(tài)數(shù)組,則使用標準容器std::vector則更好。在兩者的內(nèi)部都實現(xiàn)了前文提到的對象生命周期管理,在離開作用域后,通過析構(gòu)函數(shù)自動釋放管理的內(nèi)存,無需再手動進行回收。

那么,一個顯而易見的推論就出來了,如果我們在類中使用智能指針或者vector容器來替代new/delete管理動態(tài)內(nèi)存,是不是就可以不用析構(gòu)函數(shù)了?嚴格來說,是不用顯式使用析構(gòu)函數(shù):

class ImageEx
{
public:
    ImageEx():
        data(10)
    {
        cout << "Execute the constructor!" << endl;        
    }
private:
    std::vector<unsigned char> data;
};
int main()
{
    ImageEx imageEx;      
    return 0;
}

實際上,并不是這個類不存在析構(gòu)函數(shù),而是編譯器會為它生成一個合成的析構(gòu)函數(shù),在這個析構(gòu)函數(shù)體中,什么也不用做。因為類中的動態(tài)內(nèi)存,已經(jīng)交由std::vector容器來管理。當類對象離開作用域調(diào)用析構(gòu)函數(shù)之后,會銷毀這個std::vector容器數(shù)據(jù)成員,進而觸發(fā)其析構(gòu)函數(shù),釋放其管理的內(nèi)存。

2.3. 析構(gòu)的必要性

根據(jù)上一節(jié)內(nèi)容,不一定需要顯式析構(gòu)。因為現(xiàn)代C++的一些機制能夠幫你自動管理動態(tài)內(nèi)存。但是析構(gòu)函數(shù)還是必要的,這是由于C++語言本身的性質(zhì)決定的。作為C語言大部分內(nèi)容的超集,需要兼容C語言手動管理內(nèi)存的特性。更重要的是,現(xiàn)代操作系統(tǒng)幾乎全部由C語言編寫,與底層的交互不可避免的需要手動使用動態(tài)內(nèi)存管理。

3. 總結(jié)

所以我們就能理解了,C++這門語言的設(shè)計哲學就是就是這樣:既想要C語言的高性能,也想要高級語言高度抽象的特性。如果我們必須兼容C語言底層設(shè)計,那我們最好使用析構(gòu)函數(shù)釋放動態(tài)內(nèi)存;否則多數(shù)情況下,我們應(yīng)該使用智能指針或者stl容器來管理動態(tài)內(nèi)存,從而避免顯示使用析構(gòu)函數(shù)。

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!     

相關(guān)文章

  • C語言數(shù)組詳細介紹

    C語言數(shù)組詳細介紹

    大家好,本篇文章主要講的是C語言數(shù)組詳細介紹,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2022-01-01
  • C++定義和初始化string對象實例詳解

    C++定義和初始化string對象實例詳解

    這篇文章主要為大家介紹了C++定義和初始化string對象實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • C語言基礎(chǔ)文件操作方式超全詳解建議收藏

    C語言基礎(chǔ)文件操作方式超全詳解建議收藏

    這篇文章主要為大家介紹了關(guān)于C語言文件操作方式的詳細總結(jié),建議收藏隨用隨看,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-10-10
  • OpenCV邊緣提取算法流程的實現(xiàn)(附DEMO)

    OpenCV邊緣提取算法流程的實現(xiàn)(附DEMO)

    本文主要介紹了OpenCV邊緣提取算法流程的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-08-08
  • OpenCV實現(xiàn)圖像校正功能

    OpenCV實現(xiàn)圖像校正功能

    這篇文章主要為大家詳細介紹了OpenCV實現(xiàn)圖像校正功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • 一篇文章帶你了解C語言函數(shù)的可重入性

    一篇文章帶你了解C語言函數(shù)的可重入性

    這篇文章主要為大家詳細介紹了C語言函數(shù)的可重入性,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • 從頭學習C語言之二維數(shù)組

    從頭學習C語言之二維數(shù)組

    這篇文章主要為大家詳細介紹了C語言之二維數(shù)組,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • C++ 中類對象類型的轉(zhuǎn)化的實例詳解

    C++ 中類對象類型的轉(zhuǎn)化的實例詳解

    這篇文章主要介紹了C++ 中類對象類型的轉(zhuǎn)化的實例詳解的相關(guān)資料,這里提供實例幫助大家學習理解這部分內(nèi)容,需要的朋友可以參考下
    2017-08-08
  • Qt5實現(xiàn)文本編輯器(附詳細代碼)

    Qt5實現(xiàn)文本編輯器(附詳細代碼)

    QT是一個跨平臺的GUI開發(fā)框架,我使用的QT5 C++版本的,本文主要介紹了Qt5實現(xiàn)文本編輯器,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • FFmpeg實戰(zhàn)之分離出PCM數(shù)據(jù)

    FFmpeg實戰(zhàn)之分離出PCM數(shù)據(jù)

    PCM(Pulse?Code?Modulation,脈沖編碼調(diào)制)音頻數(shù)據(jù)是未經(jīng)壓縮的音頻采樣數(shù)據(jù)裸流,它是由模擬信號經(jīng)過采樣、量化、編碼轉(zhuǎn)換成的標準數(shù)字音頻數(shù)據(jù)。本文將通過FFmpeg實現(xiàn)分離PCM數(shù)據(jù),感興趣的可以了解一下
    2023-02-02

最新評論

米易县| 威远县| 伽师县| 莱阳市| 灌云县| 昌宁县| 海口市| 西华县| 武夷山市| 化州市| 平山县| 布拖县| 奉贤区| 四川省| 疏附县| 红桥区| 锦州市| 呼玛县| 濮阳市| 拜城县| 饶阳县| 平乐县| 涿州市| 南投县| 谷城县| 龙门县| 西和县| 西青区| 柯坪县| 开江县| 南安市| 定南县| 曲阜市| 福州市| 嫩江县| 关岭| 津南区| 平塘县| 孝昌县| 怀安县| 古蔺县|