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生鲜电商平台本文将从优惠券设计用户端,需求端,业务流程全方案解析优惠券设计方案 为什么要设计优惠券 设计优惠券的核心:拉新和促活 新产品上线 ...
随机推荐
- 【JavaScript】Object.prototype.toString.call()进行类型判断
权声明:本文为博主原创文章,未经博主允许不得转载. op = Object.prototype, ostring = op.toString, ... function isFunction(it) ...
- C语言的本质(15)——C语言的函数接口入门
C语言的本质(15)--C语言的函数接口 函数的调用者和其实现者之间存在一个协议,在调用函数之前,调用者要为实现者提供某些条件,在函数返回时,实现者完成调用者需要的功能. 函数接口通过函数名,参数和返 ...
- 【Leetcode】查找二叉树中任意结点的最近公共祖先(LCA问题)
寻找最近公共祖先,示例如下: 1 / \ 2 3 / \ / \ 4 5 6 7 / \ ...
- [Leetcode][Python]43: Multiply Strings
# -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 43: Multiply Stringshttps://leetcode.co ...
- [置顶] 获取系统时间的方法--linux
一. localtime 函数获取(年/月/日/时/分/秒)数值. 1.感性认识 #include<time.h> //C语言的头文件 #include<stdio.h> ...
- Linux之旅(1): diff, patch和quilt (下)
Linux之旅(1): diff, patch和quilt (下) 2 quilt 我们自己的项目能够用cvs或svn管理所有代码.但有时我们要使用其它开发人员维护的项目.我们须要改动一些文件,但又不 ...
- Swift自定义Class实现Hashable
假如有个Bit类,其中含有CGPoint类型的point属性,Class定义如下 class Bit { var point : CGPoint init(point : CGPoint) { sel ...
- 【floyd存字典序路径】【HDU1385】【Minimum Transport Cost】
题目大意 求多组i到j的最短路径 并输出字典序最小.... 现在只会floyd的方式 利用dis[i][j] 表示i到j的路径中i 后面的节点 更新是比较dis[i][j] dis[i][k]. 记住 ...
- linq to sql简单使用
1.新建一个winform项目. 2.添加一个Linq to Sql 类,命名为Northwind 3.打开服务器资源管理器,将表拖动到linq to sql 类,实体类就由Vs生成了 4.实例化Da ...
- 运用Hibernate-Tools自动生成Java类和schema时,出现not found while looking for property...异常
问题描述: 在使用Hibernate-tools时出现not found while looking for property...(具体信息省略). 问题分析: 我找到出错对应的hbm.xml文件, ...