【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                     //错误

}

相关文章
相关标签/搜索