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						//错误
    }
    
  • 相关阅读:
    [kuangbin带你飞]专题十二 基础DP1 E
    hdu 1203 I NEED A OFFER! (01背包)
    hdu 2602 Bone Collector (01背包)
    hdu 4513 吉哥系列故事——完美队形II (manacher)
    hdu 2203 亲和串 (KMP)
    hdu 1686 Oulipo (KMP)
    hdu 1251 统计难题 (字典树)
    hdu 2846 Repository (字典树)
    hdu 1711 Number Sequence (KMP)
    poj 3461 Oulipo(KMP)
  • 原文地址:https://www.cnblogs.com/qq329914874/p/6657692.html
Copyright © 2011-2022 走看看