中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

【C++】智能指針的原始寫法、scoped寫法、shared寫法

  智能指針的三種常見寫法:

創(chuàng)新互聯(lián)公司是一家專業(yè)提供科爾沁左翼企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站設(shè)計、做網(wǎng)站、H5技術(shù)、小程序制作等業(yè)務(wù)。10年已為科爾沁左翼眾多企業(yè)、政府機構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站制作公司優(yōu)惠進行中。

  一、最開始的原始寫法,原始寫法可以理解為指針轉(zhuǎn)移的方法。

template<typename T>
class AutoPtr
{
public:
    AutoPtr()
        :_ptr(NULL)
    {}

    AutoPtr(T* ptr)
        :_ptr(ptr)
    {}

    ~AutoPtr()
    {
        if (_ptr)
        {
            delete _ptr;
            _ptr = NULL;
        }
    }

    AutoPtr<T>(AutoPtr<T>& ap)
        : _ptr(ap._ptr)
    {
        ap._ptr = NULL;
    }

    AutoPtr<T>& operator = (AutoPtr<T>& ap)
    {
        if (this != &ap)
        {
            delete _ptr;
            _ptr = ap._ptr;
            ap._ptr = NULL;
        }

        return *this;
    }


    T& operator*()
    {
        return *_ptr;

    }

    T* GerPtr()
    {
        return _ptr;
    }
private:
    T* _ptr;
};

  二、演變?yōu)楹髞淼膕coped寫法,又可以稱作守衛(wèi)寫法。該寫法相對于原始寫法的優(yōu)點在于不讓使用拷貝構(gòu)造和運算符的重載,這樣就避免了深淺拷貝的指針問題。做法是把拷貝構(gòu)造、運算符的重載定聲明出來而不定義,并且用protected保護起來。scoped寫法是引用的boost庫。有興趣的可以去了解一下這個東西,背后還是有很多故事的,在這我就不多說啦。

template<class T>
class scopedPtr
{
public:
    scopedPtr()
        :_ptr(NULL)
    {}

    scopedPtr(T* ptr)
        :_ptr(ptr)
    {}

    ~scopedPtr()
    {
        if (_ptr)
        {
            delete _ptr;
            _ptr = NULL;
        }
    }
    
    T& operator*()
    {
        return *_ptr;
    }

    T* operator->()
    {
        return _ptr;
    }

    T* GetPtr()
    {
        return _ptr;
    }

protected: //加上protected可以防止使用者在類之外定義拷貝構(gòu)造和運算符的重載函數(shù)
    scopedPtr<T>(const scopedPtr<T>& sp);        //不讓使用者使用拷貝,可以防止拷貝,所以只聲明不定義
    scopedPtr<T>& operator=(const scopedPtr<T>& sp);

private:
    T* _ptr;
};

  三、sharedPtr寫法

這種方法考慮了深淺拷貝問題并且引用了引用計數(shù)器來解決淺拷貝的問題,比較完善的實現(xiàn)了智能指針想要實現(xiàn)的功能。

template<class T>
class SharePtr
{
public:
    SharePtr(T* ptr)
        :_ptr(ptr)
        , _pCount(new int(1))
    {}

    //SharePtr(Shar)
    //    :_ptr(sp._ptr)
    //{
    //    *_pCount = 1;
    //}

    ~SharePtr()
    {
        if (_ptr)
        {
            if (--(*_pCount) == 0)
            {
                delete _ptr;
                delete _pCount;
                _ptr = NULL;
                _pCount = NULL;
            }

            _ptr = NULL;
        }
    }

    SharePtr<T>(const SharePtr<T>& sp)
    {
        _ptr = sp._ptr;
        _pCount = sp._pCount;
        ++(*_pCount);
    }

    SharePtr<T>& operator=(const SharePtr<T>& sp)
    {
        if (this != &sp)
        {
            if (--(*_pCount) == 0)    //這里要分清楚是誰減一,邏輯需要分析清楚
            {
                delete _ptr;
                delete _pCount;
                _ptr = NULL;
                _pCount = NULL;
            }

            _ptr = sp._ptr;
            _pCount = sp._pCount;
            ++(*_pCount);
        }
        return *this;
    }

private:
    T* _ptr;
    int* _pCount;
};

網(wǎng)站名稱:【C++】智能指針的原始寫法、scoped寫法、shared寫法
轉(zhuǎn)載來于:http://www.rwnh.cn/article8/jepgop.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設(shè)、品牌網(wǎng)站設(shè)計、網(wǎng)站排名、云服務(wù)器、企業(yè)網(wǎng)站制作、外貿(mào)建站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站
那坡县| 万山特区| 且末县| 隆林| 南澳县| 莆田市| 竹溪县| 云林县| 沅江市| 宁河县| 乌兰察布市| 宁城县| 清丰县| 随州市| 开化县| 全南县| 东乡族自治县| 章丘市| 乌拉特前旗| 台北市| 黄梅县| 左云县| 团风县| 河南省| 徐水县| 义马市| 思南县| 盐山县| 车险| 馆陶县| 武陟县| 五河县| 栖霞市| 德令哈市| 延安市| 永登县| 通海县| 馆陶县| 翼城县| 山阳县| 长乐市|