文档章节

【C++】智能指针简述(三):scoped_ptr

shzwork
 shzwork
发布于 03/18 18:27
字数 738
阅读 22
收藏 0

在介绍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                     //错误

}

本文转载自:https://www.cnblogs.com/qq329914874/p/6657692.html

shzwork
粉丝 15
博文 805
码字总数 10675
作品 0
厦门
私信 提问
【C++】智能指针简述(四):shared_ptr

  在开始本文内容之前,我们再来总结一下,前文内容:   1.智能指针采用RAII机制,在构造对象时进行资源的初始化,析构对象时进行资源的清理及汕尾.   2.autoptr防止拷贝后析构释放同一块内...

shzwork
03/18
6
0
boost库之智能指针

何时需要使用智能指针: 1. 资源所有权共享。 a) 如果多个对象需要同时使用第三个对象时,就需要知道这第三个对象是何时释放的,释放的时机要正确。 2. 要编写异常安全的代码时。 a) 就是当异...

风雅轩
2017/10/23
0
0
C++智能指针,指针容器原理及简单实现(auto_ptr,scoped_ptr,ptr_vector).

目录 C++智能指针,指针容器原理及简单实现(autoptr,scopedptr,ptrvector). autoptr scopedptr ptrvector C++智能指针,指针容器原理及简单实现(autoptr,scopedptr,ptrvector). 前言 最近再写一...

艾露米婭娜
2018/08/09
0
0
Chromium的智能指针/引用计数/Callback/Bind

这四个东西对使用者来说不难,看懂代码注释里的例子即可,预计1小时左右看懂全部。要去理解其设计思想的话最需要掌握的是模板类的使用,但一般使用者完全不用关心怎么设计的。 使用者的学习路...

zhangyujsj
2015/08/22
145
0
boost学习之--shared_ptr

在boost中,有一个智能指针类shared_ptr可以管理好我们的指针。这里我不详解,以下列出使用例子。自己现写现调通过的哈: #include <iostream> include <boost/shared_ptr.hpp> include <bo...

临峰不畏
2013/03/19
1K
1

没有更多内容

加载失败,请刷新页面

加载更多

golang-字符串-地址分析

demo package mainimport "fmt"func main() {str := "map.baidu.com"fmt.Println(&str, str)str = str[0:5]fmt.Println(&str, str)str = "abc"fmt.Println(&s......

李琼涛
今天
4
0
Spring Boot WebFlux 增删改查完整实战 demo

03:WebFlux Web CRUD 实践 前言 上一篇基于功能性端点去创建一个简单服务,实现了 Hello 。这一篇用 Spring Boot WebFlux 的注解控制层技术创建一个 CRUD WebFlux 应用,让开发更方便。这里...

泥瓦匠BYSocket
今天
9
0
从0开始学FreeRTOS-(列表与列表项)-3

FreeRTOS列表&列表项的源码解读 第一次看列表与列表项的时候,感觉很像是链表,虽然我自己的链表也不太会,但是就是感觉很像。 在FreeRTOS中,列表与列表项使用得非常多,是FreeRTOS的一个数...

杰杰1号
今天
9
0
Java反射

Java 反射 反射是框架设计的灵魂(使用的前提条件:必须先得到代表的字节码的 Class,Class 类 用于表示.class 文件(字节码)) 一、反射的概述 定义:JAVA 反射机制是在运行状态中,对于任...

zzz1122334
今天
9
0
聊聊nacos的LocalConfigInfoProcessor

序 本文主要研究一下nacos的LocalConfigInfoProcessor LocalConfigInfoProcessor nacos-1.1.3/client/src/main/java/com/alibaba/nacos/client/config/impl/LocalConfigInfoProcessor.java p......

go4it
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部