首页 > 代码库 > 【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,并且只给出其声明,就像这样:

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

【C++】智能指针详解(三):scoped_ptr