zoukankan      html  css  js  c++  java
  • 【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,并且只给出其声明,就像这样:

    class ScopedPtr{
    private:
        ScopedPtr(const ScopedPtr& sp);
        ScopedPtr& operator(const ScopedPtr& sp);   
    };
    

      因此,scoped_ptr的"核心技术",再次被我们所剖析、掌握!

      最终,给出我写的精简版代码:

    /*
    *文件说明:模拟实现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						//错误
    }
    
  • 相关阅读:
    Kivy Minimum required opengl version (2.0) not found
    Rust 在Jebrains 家族工具里报 No Cargo projects found!
    Rust Cargo 下载慢的解决办法
    Python面试题库学习1-5
    Kivy Pyinstaller打包报: No module named pkg_resources.py2_warn
    Kettle 部署和远程调用(spoon 8.3)
    spring boot 发布的jar 二 发布到 windows
    spring boot 发布的jar 一 发布到 linux centos7
    springBoot项目打jar包后,修改配置文件中的配置项
    mysql sqldump 备份
  • 原文地址:https://www.cnblogs.com/qq329914874/p/6657692.html
Copyright © 2011-2022 走看看