1. 程式人生 > >【C++】智慧指標簡述(三):scoped_ptr

【C++】智慧指標簡述(三):scoped_ptr

開發十年,就只剩下這套架構體系了! >>>   

在介紹scoped_ptr之前,我們先回顧一下前兩篇文章的內容.

  首先,智慧指標採用RAII機制,通過物件來管理指標,構造物件時,完成資源的初始化;析構物件時,對資源進行清理及汕尾.

  auto_ptr,通過轉移管理權來完成物件的拷貝與賦值,在實際開發中並不實用.

  回顧完智慧指標的背景及auto_ptr的特性之後,本文來介紹scoped_ptr的實現原理及特性.

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

  誒?當我瞭解到這裡的時候,那麼問題來了:scoped_ptr是通過什麼方法來做到禁止使用者進行拷貝與賦值呢?

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

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

  在C++中,如果你不定義拷貝建構函式/賦值運算子過載函式的話,當你在呼叫時,系統會自動預設生成相應的函式.

  但,系統預設生成的函式,完成的僅僅是值的拷貝,即淺拷貝!(當然,深淺拷貝的問題,就不在這裡多說了,以後再談.)

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

  此時,我突然靈光一現:想起了《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                     //錯誤

}