auto_ptr 要点解析
今天看了auto_ptr类的用法,又仔细看了看C++标准库中的符合标准的auto_ptr类别的实作,觉得自己基本上理解了auto_ptr的原理,下面就我的心得写几句,有不正确的地方,希望多多指教。
1. 初始化auto_ptr(T* ptr = 0);参数必须是new申请的空间,而且不能是数组。
2. 看代码:
auto_ptr(auto_ptr& ths):ap(ths.release()){}
template<class Y>
auto_ptr(auto_ptr<Y>& rhs):ap(rhs.release()){} //继承用,父类指针指向基类
auto_ptr& operator =(auto_ptr& rhs)
{
reset(rhs.release());
return *this;
}
template<class Y>
auto_ptr& operator=(auto_ptr<Y>& rhs) // 比如Y为double,T为int,可以实现这种隐式转换
{
reset(rhs.release());
return *this;
}
3. 特殊转换与禁用const 类型的大部分功能,比如:赋值和初始化
auto_ptr(auto_ptr& ths):ap(ths.release()){}
//抑制产生Myauto_ptr(const Myauto_ptr& ths),
//没有这个函数就不能对用const auot_ptr<int> p
// auto_ptr<int> pp(p);是错误的
auto_ptr& operator =(auto_ptr& rhs)
// 同样参数不用const修饰,auto_ptr<int> pp = p;也是错误的
//你发现const auto_ptr<int> p 通过限制,使其拥有权不会发生转移
// 但是允许auto_ptr<int> p = auto_ptr<int>(new int(1));就需要通过 auto_ptr_ref机制来实现
//auto_ptr<int>(new int(1)) 产生一个临时变量,这个临时变量需要赋给 参数为 const auto_ptr<int>&
//类型的参数,因为没有这个默认的复制构造函数,
//所以无法转换,但是通过下面的函数可以正确执行。
//1.auto_ptr<int>(new int(1)) 产生一个临时对象
//2.operator auto_ptr_ref<Y>() 隐式转换为 auto_ptr_ref对象
//3.auto_ptr(auto_ptr_ref<T> rhs) 构造出一个auto_ptr对象
//这就是引入这个auto_ptr_ref的原因,但是肯定不止这些用意,也许有其他的用意,以后再补上。
template<class Y>
struct auto_ptr_ref
auto_ptr(auto_ptr_ref<T> rhs)
auto_ptr& operator=(auto_ptr_ref<T> rhs)
template<class Y>
operator auto_ptr_ref<Y>()
template<class Y>
operator auto_ptr<Y>()
4.程序的示例(为了在编译器好运行,我把auto_ptr 改为 Myauto_ptr,防止和标准库的重复)
template<class Y>
struct Myauto_ptr_ref
{
Y* yp;
Myauto_ptr_ref(Y* ths):yp(ths){}
}; template<class T>
class Myauto_ptr
{
private:
T* ap;
public:
typedef T element_type; explicit Myauto_ptr(T *ptr = 0):ap(ptr){} Myauto_ptr(Myauto_ptr& ths):ap(ths.release()){} template<class Y>
Myauto_ptr(Myauto_ptr<Y>& rhs):ap(rhs.release()){} //继承用,父类指针指向基类 Myauto_ptr& operator =(Myauto_ptr& rhs)
{
reset(rhs.release());
return *this;
} template<class Y>
Myauto_ptr& operator=(Myauto_ptr<Y>& rhs)
{
reset(rhs.release());
return *this;
} ~Myauto_ptr()
{
delete ap;
} T* get()
{
return ap;
} T& operator*() const
{
return *ap;
} T* operator->()const
{
return ap;
} T* release()
{
T* tmp(ap);
ap = 0;
return tmp;
} void reset(T* ptr = 0)
{
if(ap != ptr)
{
delete ap;
ap = ptr;
}
} Myauto_ptr(Myauto_ptr_ref<T> rhs) : ap(rhs.yp){} Myauto_ptr& operator=(Myauto_ptr_ref<T> rhs)
{
reset(rhs.yp);
return *this;
} template<class Y>
operator Myauto_ptr_ref<Y>()
{
return Myauto_ptr_ref<Y>(release());
} template<class Y>
operator Myauto_ptr<Y>()
{
return Myauto_ptr<Y>(release());
}
};
auto_ptr 要点解析的更多相关文章
- DTLS 技术要点解析
一.DTLS DTLS 是指 Datagram Transport Level Security,即数据报安全传输协议: 其提供了UDP 传输场景下的安全解决方案,能防止消息被窃听.篡改.身份冒充等问 ...
- android安全测试 APP要点解析
评估思路 移动APP面临的威胁 风起云涌的高科技时代,随着智能手机和iPad等移动终端设备的普及,人们逐渐习惯了使用应用客户端上网的方式,而智能终端的普及不仅推动了移动互联网的发展,也带来了移动应用的 ...
- angular 指令 要点解析
指令可以删繁就简前端的js代码,杜绝重复的js代码和html代码. 下面就对指令的重要属性进行罗列 一.restrict = 'AECM' 分别指该指令标识位于 attribute属性: < ...
- 集群搭建之Spark配置要点解析
注意点: 安装Spark前先要配置好Scala运行环境. Spark和Scala需要在各个机器上配置. 环境变量配置 在~/.bashrc中添加如下的配置信息. #scala conf export ...
- java中的String要点解析
String类使我们经常使用的一个类,经常用来表示字符串常量. 字符串一旦被创建赋值,就不能被改变,因为String 底层是数组实现的,且被定义成final类型.我们可以看String源码. /** ...
- SSL/TLS算法流程解析
SSL/TLS 早已不是陌生的词汇,然而其原理及细则却不是太容易记住.本文将试图通过一些简单图示呈现其流程原理,希望读者有所收获. 一.相关版本 Version Source Description ...
- DTLS-PSK算法抓包解析
一.DTLS -PSK PSK 是DTLS 定义的密钥交换方案之一,相对于公钥证书方案(如 ECDHA_RSA) 来说,其具备更加轻量化.高效的优点: 而目前 PSK方案应用也比较广泛. 关于DTLS ...
- APPcrawler基础原理解析及使用
一.背景 一年前,我们一直在用monkey进行Android 的稳定性测试 ,主要目的就是为了测试app 是否会产生Crash,是否会有ANR,页面错误等问题,在monkey测试过程中,实现了脱离Ca ...
- Java生鲜电商平台-商城优惠券设计要点复盘与总结
Java生鲜电商平台-商城优惠券设计要点复盘与总结 Java生鲜电商平台本文将从优惠券设计用户端,需求端,业务流程全方案解析优惠券设计方案 为什么要设计优惠券 设计优惠券的核心:拉新和促活 新产品上线 ...
随机推荐
- C# 迪杰斯特拉(Dijkstra)算法
Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止. 其基本思想是,设置顶点集合S并不断地作 ...
- 【Leetcode】寻找数串中连续最大整数和且最大长度的子串
寻找数串中连续最大整数和且最大长度的子串 输入示例: 1000 -100 200 -200 100 -100 10 90 输出结果: 1100 分析: 分治法解决问题非常方便,依然分为三种情况:a[1 ...
- (译)"usermod"命令使用完全指导---15个练习例程截图
"usermod"命令使用完全指导---15个练习例程截图 By Babin Lonston Under: Linux Commands On: November 11, 2014 ...
- (续)线性表之双向链表(C语言实现)
在前文实现单向链表的基本操作下,本文实现双向链表的基本操作. 双向链表与单链表差异,是双向链表结点中有前向指针和后向指针.所以在插入和删除新结点元素时候不见要考虑后向指针还要考虑前向指针. 以下是双向 ...
- OpenStack开启sshd
修改配置sshd的文件 1. 修改sshd配置文件 /etc/ssh/sshd_config 2. 将#PasswordAuthentication no的注释去掉,并将no改为y ...
- 项目中常用方法总结(将将DataTable数据集映射到实体对象)【转】
本篇把项目中用到的一些通用方法总结出来, 这些方法因为经常需要在项目中用到,所以把它们归纳在一起, 形成一个.dll 文件是一个理想的选择. 这样也便于日后缩短开发周期. 一. 把一个DataGrid ...
- and then set HOMEBREW_GITHUB_API_TOKEN.
andyMacBook-Pro:~ andy$ brew search redis hiredis redis homebrew/nginx/redis2-nginx-module Error: ...
- c# 校验文本框的正则
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 #region ...
- JavaScript 【非IE DOM2级XML】
DOM2中的XML IE可以实现了对XML字符串或XML文件的读取,其他浏览器也各自实现了对XML处理功能.DOM2级在document.implementaion中引入了createDocument ...
- http头部信息研究
1. Accept:告诉WEB服务器自己接受什么介质类型,*/* 表示任何类型,type/* 表示该类型下的所有子类型,type/sub-type. 2. Accept-Charset: 浏览器申明自 ...