今天看了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 要点解析的更多相关文章

  1. DTLS 技术要点解析

    一.DTLS DTLS 是指 Datagram Transport Level Security,即数据报安全传输协议: 其提供了UDP 传输场景下的安全解决方案,能防止消息被窃听.篡改.身份冒充等问 ...

  2. android安全测试 APP要点解析

    评估思路 移动APP面临的威胁 风起云涌的高科技时代,随着智能手机和iPad等移动终端设备的普及,人们逐渐习惯了使用应用客户端上网的方式,而智能终端的普及不仅推动了移动互联网的发展,也带来了移动应用的 ...

  3. angular 指令 要点解析

    指令可以删繁就简前端的js代码,杜绝重复的js代码和html代码. 下面就对指令的重要属性进行罗列 一.restrict  =  'AECM'  分别指该指令标识位于 attribute属性: < ...

  4. 集群搭建之Spark配置要点解析

    注意点: 安装Spark前先要配置好Scala运行环境. Spark和Scala需要在各个机器上配置. 环境变量配置 在~/.bashrc中添加如下的配置信息. #scala conf export ...

  5. java中的String要点解析

    String类使我们经常使用的一个类,经常用来表示字符串常量. 字符串一旦被创建赋值,就不能被改变,因为String 底层是数组实现的,且被定义成final类型.我们可以看String源码. /** ...

  6. SSL/TLS算法流程解析

    SSL/TLS 早已不是陌生的词汇,然而其原理及细则却不是太容易记住.本文将试图通过一些简单图示呈现其流程原理,希望读者有所收获. 一.相关版本 Version Source Description ...

  7. DTLS-PSK算法抓包解析

    一.DTLS -PSK PSK 是DTLS 定义的密钥交换方案之一,相对于公钥证书方案(如 ECDHA_RSA) 来说,其具备更加轻量化.高效的优点: 而目前 PSK方案应用也比较广泛. 关于DTLS ...

  8. APPcrawler基础原理解析及使用

    一.背景 一年前,我们一直在用monkey进行Android 的稳定性测试 ,主要目的就是为了测试app 是否会产生Crash,是否会有ANR,页面错误等问题,在monkey测试过程中,实现了脱离Ca ...

  9. Java生鲜电商平台-商城优惠券设计要点复盘与总结

    Java生鲜电商平台-商城优惠券设计要点复盘与总结 Java生鲜电商平台本文将从优惠券设计用户端,需求端,业务流程全方案解析优惠券设计方案 为什么要设计优惠券 设计优惠券的核心:拉新和促活 新产品上线 ...

随机推荐

  1. Inno Setup GIF 显示插件 GIFCtrl (V2.1 版本)

    原文 http://restools.hanzify.org/article.asp?id=79  引用来自 test.iss ; -- test.iss --; restools; http://r ...

  2. cf467B Fedor and New Game

    B. Fedor and New Game time limit per test 1 second memory limit per test 256 megabytes input standar ...

  3. vsftpd配置---------------------之chroot_local_user和chroot_list_enable含义

    chroot_local_user和chroot_list_enable含义 很多情况下,我们希望限制ftp用户只能在其主目录下(root dir)下活动,不允许他们跳出主目录之外浏览服务器上 的其他 ...

  4. mysql中limit用法误区

    之前一直用oracle,在分页的时候用rownumber,转换到mysql上之后,用limit做分页: 在做某个业务的时候,需要先将数据排序,再分页,在给limit上参数的时候沿用了oracle的ro ...

  5. ping网络故障

    网络的应用已渐渐深入我们的工作和生活,它带给了我们各方面的便利.因此,这种种的便利致使很多人对网络产生依赖性.那么,当电脑不能上网时,我们如何才能准确地判断电脑问题出在哪里?又如何能快捷地解决这故障? ...

  6. jquery第三期:js与jquery对象转换

    我们开始进入jquery的学习了,jquery的学习就不那么中规中矩了,我们来看一个和javascript有所区别的地方. <!DOCTYPE html PUBLIC "-//W3C/ ...

  7. git创建分支

    1.创建本地分支名称为dev的本地分支 git branch dev 2.将本地分支添加到远程分支 git push origin dev 3.查看创建的本地分支, 带有*符号的分支,代表当前所在分支 ...

  8. 经典 SQL

    经典sql   总结一些经常用到或碰到的SQL语句,希望能与大家分享,同时也希望大家能提供更多的精妙SQL语句..... 1.delete table1 from (select * from tab ...

  9. java多线程并发例子

    public static void main(String[] args) { for(Thread t:getThreads()){ t.start(); } } public static Th ...

  10. LeetCode之ReverseWorldString

    题目:将一个英文句子翻转,比如:the sky is blue 翻转后变为:blue is sky the 分析:我的实现方法是,利用栈将单词存储起来,然后再顺序拿出来,单词进栈还需注意添加空格. 主 ...