【C++】智能指针简述(三):scoped_ptr
2017-04-01 22:09
218 查看
在介绍scoped_ptr之前,我们先回顾一下前两篇文章的内容.
首先,智能指针采用RAII机制,通过对象来管理指针,构造对象时,完成资源的初始化;析构对象时,对资源进行清理及汕尾.
auto_ptr,通过转移管理权来完成对象的拷贝与赋值,在实际开发中并不实用.
回顾完智能指针的背景及auto_ptr的特性之后,本文来介绍scoped_ptr的实现原理及特性.
scoped_ptr与auto_ptr类似,但最大的区别就是它不能转让管理权.也就是说,scoped_ptr禁止用户进行拷贝与赋值.
诶?当我了解到这里的时候,那么问题来了:scoped_ptr是通过什么方法来做到禁止用户进行拷贝与赋值呢?
换句话说:C++中有什么方法可以禁止一个类进行拷贝构造和赋值呢?
那么我第一时间想到的是:既然禁止你进行拷贝和赋值,那我不写相应函数不就行了?
在C++中,如果你不定义拷贝构造函数/赋值运算符重载函数的话,当你在调用时,系统会自动默认生成相应的函数.
但,系统默认生成的函数,完成的仅仅是值的拷贝,即浅拷贝!(当然,深浅拷贝的问题,就不在这里多说了,以后再谈.)
也就是说,这种方法绝对没办法禁止一个类进行拷贝构造与赋值.
此时,我突然灵光一现:想起了《Effective C++》中某条款提到了这个,其实要做的很简单:
我们只需把拷贝构造函数与赋值运算符重载的访问限定符设置为private,并且只给出其声明,就像这样:
因此,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++智能指针,指针容器原理及简单实现(auto_ptr,scoped_ptr,ptr_vector).
- C++:Boost库智能指针_scoped_ptr
- 【C++】智能指针简述(四):shared_ptr
- C++智能指针,指针容器原理及简单实现(auto_ptr,scoped_ptr,ptr_vector).
- C++:Boost智能指针——scoped_ptr
- [置顶] 从零开始学C++之boost库(一):详解 boost 库智能指针(scoped_ptr<T> 、shared_ptr<T> 、weak_ptr<T> 源码分析)
- C++智能指针(scoped_ptr<T> 、shared_ptr<T> 、weak_ptr<T> )
- [置顶] 从零开始学C++之boost库(一):详解 boost 库智能指针(scoped_ptr<T> 、shared_ptr<T> 、weak_ptr<T> 源码分析)
- 【C++】智能指针简述(二):auto_ptr
- C++学习之智能指针--auto_ptr、scoped_ptr、scoped_array、shared_ptr、shared_array、weak_ptr
- 【C++】智能指针的作用,模拟实现auto_ptr,scoped_ptr,shared_ptr,scoped_array,shared_array
- 从零开始学C++之boost库(一):详解 boost 库智能指针(scoped_ptr<T> 、shared_ptr<T> 、weak_ptr<T> 源码分析)
- 【C++】智能指针简述(五):解决循环引用的weak_ptr
- 详解C++各种智能指针: auto_ptr, shared_ptr, weak_ptr, scoped_ptr
- 【C++】智能指针的作用,模拟实现auto_ptr,scoped_ptr,shared_ptr,scoped_array,shared_array
- C++智能指针(auto_ptr)详解
- C++常用的智能指针auto_ptr、shared_ptr
- C++ 11智能指针之week_ptr
- c++智能指针:auto_ptr shared_ptr
- 实战c++中的智能指针unique_ptr系列-- unique_ptr的get_deleter方法(自定义删除器)