在介绍scoped_ptr以前,咱们先回顾一下前两篇文章的内容.函数
首先,智能指针采用RAII机制,经过对象来管理指针,构造对象时,完成资源的初始化;析构对象时,对资源进行清理及汕尾.spa
auto_ptr,经过转移管理权来完成对象的拷贝与赋值,在实际开发中并不实用.指针
回顾完智能指针的背景及auto_ptr的特性以后,本文来介绍scoped_ptr的实现原理及特性.code
scoped_ptr与auto_ptr相似,但最大的区别就是它不能转让管理权.也就是说,scoped_ptr禁止用户进行拷贝与赋值.对象
诶?当我了解到这里的时候,那么问题来了:scoped_ptr是经过什么方法来作到禁止用户进行拷贝与赋值呢?ci
换句话说:C++中有什么方法能够禁止一个类进行拷贝构造和赋值呢?资源
那么我第一时间想到的是:既然禁止你进行拷贝和赋值,那我不写相应函数不就好了?开发
在C++中,若是你不定义拷贝构造函数/赋值运算符重载函数的话,当你在调用时,系统会自动默认生成相应的函数.io
但,系统默认生成的函数,完成的仅仅是值的拷贝,即浅拷贝!(固然,深浅拷贝的问题,就不在这里多说了,之后再谈.)table
也就是说,这种方法绝对没办法禁止一个类进行拷贝构造与赋值.
此时,我忽然灵光一现:想起了《Effective C++》中某条款提到了这个,其实要作的很简单:
咱们只需把拷贝构造函数与赋值运算符重载的访问限定符设置为private,而且只给出其声明,就像这样:
1 2 3 4 5 |
|
所以,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 |
|