【C++】智能指針簡述(三):scoped_ptr

在介紹scoped_ptr以前,咱們先回顧一下前兩篇文章的內容.函數

  首先,智能指針採用RAII機制,經過對象來管理指針,構造對象時,完成資源的初始化;析構對象時,對資源進行清理及汕尾.spa

  auto_ptr,經過轉移管理權來完成對象的拷貝與賦值,在實際開發中並不實用.指針

  回顧完智能指針的背景及auto_ptr的特性以後,本文來介紹scoped_ptr的實現原理及特性.code

  scoped_ptr與auto_ptr相似,但最大的區別就是它不能轉讓管理權.也就是說,scoped_ptr禁止用戶進行拷貝與賦值.對象

  誒?當我瞭解到這裏的時候,那麼問題來了:scoped_ptr是經過什麼方法來作到禁止用戶進行拷貝與賦值呢?ci

  換句話說:C++中有什麼方法能夠禁止一個類進行拷貝構造和賦值呢?資源

  那麼我第一時間想到的是:既然禁止你進行拷貝和賦值,那我不寫相應函數不就好了?開發

  在C++中,若是你不定義拷貝構造函數/賦值運算符重載函數的話,當你在調用時,系統會自動默認生成相應的函數.io

  但,系統默認生成的函數,完成的僅僅是值的拷貝,即淺拷貝!(固然,深淺拷貝的問題,就不在這裏多說了,之後再談.)table

  也就是說,這種方法絕對沒辦法禁止一個類進行拷貝構造與賦值.

  此時,我忽然靈光一現:想起了《Effective C++》中某條款提到了這個,其實要作的很簡單:

  咱們只需把拷貝構造函數與賦值運算符重載的訪問限定符設置爲private,而且只給出其聲明,就像這樣:

1

2

3

4

5

class ScopedPtr{

private:

    ScopedPtr(const ScopedPtr& sp);

    ScopedPtr& operator(const ScopedPtr& sp);  

};

  所以,scoped_ptr的"核心技術",再次被咱們所剖析、掌握!

  最終,給出我寫的精簡版代碼:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

/*

*文件說明:模擬實現scoped_ptr

*做者:高小調

*日期:2017-03-31

*集成開發環境:Microsoft Visual Studio 2010

*/

#pragma once

template<typename T>

class ScopedPtr{

public:

    //構造函數

    ScopedPtr(T* ptr = NULL)

        :_ptr(ptr){}

    //析構函數

    ~ScopedPtr(){

        if(_ptr!=NULL){

            delete _ptr;

            _ptr=NULL;

        }

    }

private:

    //拷貝構造

    ScopedPtr(const ScopedPtr &sp);

    //賦值運算符重載

    ScopedPtr& operator=(const ScopedPtr &sp);

private:

    T *_ptr;

};

 

void TestScopedPtr(){

    ScopedPtr<int> sp1(new int(10));

    ScopedPtr<int> sp2(new int(20));

    //ScopedPtr<int> sp3(sp1);        //錯誤

    //sp1 = sp2                     //錯誤

}

相關文章
相關標籤/搜索