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生鲜电商平台本文将从优惠券设计用户端,需求端,业务流程全方案解析优惠券设计方案 为什么要设计优惠券 设计优惠券的核心:拉新和促活 新产品上线 ...
随机推荐
- Android(digest)
Android开发者文档这么说的: Content providers manage access to a structured set of data. They encapsulate the ...
- linux grep练习
1.显示/proc/meminfo文件中以不区分大小的s开头的行: 2.显示/etc/passwd中以nologin结尾的行; 3.显示/etc/inittab中以#开头,且后面跟一个或多个空白字符, ...
- Linux 之Cut命令详解
摘自:http://blog.csdn.net/zsf8701/article/details/7718680 Linux 之Cut命令详解 cut是一个选取命令,就是将一段数据经过分析,取出我们想要 ...
- poj 3185 The Water Bowls(反转)
Description The cows have a line of water bowls water bowls to be right-side-up and thus use their w ...
- 小黑小波比.coding的使用
1_Coding的演示 1_html的演示 1_先查看帮助 1.它支持的语言非常多.下面是链接地址 https://coding.net/u/bobo159357456/p/html/paas/hel ...
- 在 Parallels Desktop 中,全屏模式使用 Win7,唤醒时黑屏
在Parallels Desktop中,全屏模式下使用Win7,如果Mac电脑自动休眠了,则无法再次唤醒了,唤醒时黑屏. 博主的Mac是2014款MBPR,键盘上所有的键都试过,还是无法唤醒电脑,每次 ...
- chrome调试工具常用功能整理(转)
Elements chrome devtools 中 Elements panel 是审查 dom 元素和 css 的, 可以实时修改 dom/css. windows: ctrl + shift + ...
- 第五章SignalR的实时高频通讯
第五章SignalR的实时高频通讯 概述:本例子演示了如果创建一个对象与其他浏览器共享实时状态的应用程序.我们要创建的应用程序为“MoveShape”,该MoveShape页面会显示一个Html Di ...
- WdatePicker日历控件使用方法
1. 跨无限级框架显示 无论你把日期控件放在哪里,你都不需要担心会被外层的iframe所遮挡进而影响客户体验,因为My97日期控件是可以跨无限级框架显示的 示例2-7 跨无限级框架演示 可无限跨越框架 ...
- div 居中CSS实现
.login-box { position: absolute; border: solid #E3EAE7 1px; top: 50%; left: 50%; margin: -100px 0 0 ...