1,下面这段代码会引起异常,因为所有权已经转移,而通过by reference方式传递auto_ptr更是糟糕的
若改为:const auto_ptr<int> p(new int);则会在编译时提示错误.因此我们可以通过常数型auto_ptr来终结所有权转移,它并不是表示你不能更改auto_ptr所拥有的对象,而是不能更改auto_ptr的拥有权,就此特性而言,它比较类似常数指针,而不是指向常数的指针.
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->template<typenameT>
voidbad_print(auto_ptr<T>p)
{
if(p.get()==NULL)
cout<<"null";
else
cout<<*p;
}
intmain(intargc,char*argv[])
{
auto_ptr<int>p(newint);
*p=42;
bad_print(p);
*p=3;
return0;
}
2,auto_ptr之间不能共享拥有权,一个auto_ptr不能指向另一个auto_ptr所拥有的对象,否则当一个指针删除该对象后,就糟糕了.auto_ptr不能指向数组,因为它是通过delete而不是delete[]来释放其所拥有的对象.它也不是一个引用计数型指针.因为在拷贝和赋值后,原来的auto_ptr和新产生的auto_ptr并不相等,而是原auto_ptr会交出拥有权,而不是拷贝给新auto_ptr,因此也不要将auto_ptr作为标准容器的元素.
3,下面重载的输出运算符的第二个参数是一个const reference,所以并没有发生拥有权的转移.
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->template<classT>
ostream&operator<<(ostream&strm,constauto_ptr<T>&p)
{
//doespownanobject?
if(p.get()==NULL)
{
strm<<"NULL";//NO:printNULL
}
else{
strm<<*p;//YES:printtheobject
}
returnstrm;
}
4,容器可分为两类:1)序列式容器,这是ordered collection,每个元素都有固定位置,取决于插入时机和地点,和元素值无关.它们是:vector,deque,list;2)关联式容器.这是sorted collection,元素位置取决于特定的排序准则,它们是:set,multiset,map,multimap.
关联式容器自动对其元素排序,并不意味着它们就是用来排序的,这只迭是它的一个副作用而已.
5,每个容器将其迭代器以嵌套的方式定义于内部,因此各种迭代器的接口相同,类型却不同.迭代器有以下两种类型:1)双向迭代器.可以双向行进:以递增运算前进或以递减运算后退,list,set,multiset,map和multimap提供的迭代器都是此类.2)随机存取迭代器.不仅具备双向迭代器的所有属性,还具备随机访问能力.它们提供了”迭代器算术运算”必要的操作符.可以对迭代器增加或减少一个偏移量,处理迭代器之间的距离,或是使用<和>之类的相对关系操作符来比较两个迭代器.vector,deque和strings所提供的迭代器都属于此类.为了写出尽可能与容器类型无关的泛型程序代码,最好不使用随机存取迭代器的特有操作.
分享到:
相关推荐
C++Primer中文第三版(C++从入门到精通)第一章的读书笔记,主要是C++程序、预处理器指示符、iostream库等的基础知识点读书笔记。
本源代码既有多线程的使用,VC的各种控件的使用,以及动态连接库,ActiveX控件,网络编程,数据库编程,以及最后的一个整体大程序,KTV点歌系统等等
Boost是一个功能强大、构造精巧、跨平台、开源并且完全免费的C++程序库,有着“C++‘准’标准库”的美誉。 Boost由C++标准委员会部分成员所设立的Boost社区开发并维护,使用了许多现代C++编程技术,内容涵盖字符串...
本书以 Visual C++ 6.0为平台,结合 Visual C++ 6.0和MFC应用程序设计框架的最新规范,从基本的操作和技巧入手,以恰当的实例为导向,对实例代码进行层层图解的方式,由浅入深地介绍了 Visual C++开发的基本理论知识...
它是一种将程序库名称封装起来的方法,它提高了程序的性能和可靠性。 4.动态内存分配的一般格式为: 指针名 = new 结构名; delete 指针名; 5.引用的声明格式为: 数据类型 & 别名 = 对象名; 6.引用通常用于函数的...
该复习文档是本人根据谭浩强老师的《C++程序设计》、邓俊辉的《数据结构(C++语言版)》和CSDN博客上的众多文章总结而成的。感谢博客上各位大佬的总结,使我在复习课本的同时补充了很多其他方面的关键知识,如C++...
NULL 博文链接:https://hyjiang1989.iteye.com/blog/1821527
Windows编程 C++ DLL编程 学习笔记 (二)动态链接库的创建 动态调用 静态调用 本文件中只有程序,不含笔记和注释,笔记和注释请到空间察看http://giddyandyang.spaces.live.com/
Windows编程 C++ DLL编程 学习笔记(一)静态链接库的创建和使用 本文件中只有程序,不含笔记和注释,笔记和注释请到空间察看http://giddyandyang.spaces.live.com/
学习韦东山老师的4412开发板视频,做了点笔记,发出来跟大家分享一下这个学习的过程,如发现说的有误的地方,还请指出,谢谢!
源码配套博文 《【Visual C++】游戏开发笔记四十二 浅墨DirectX教程之十 游戏输入控制利器:DirectInput专场》 ,文章地址为http://blog.csdn.net/zhmxy555/article/details/8547531, 点击debug下的exe文件可以...
【Visual C++】游戏开发笔记之【浅墨DirectX提高班】系列博文 配套详细注释源码之五 源码配套博文 《【Visual C++】游戏开发笔记三十七 浅墨DirectX提高班之五 顶点缓存的红颜知己:索引缓存的故事 》 ,文章地址...
qss 样式表,本程序所有窗体、控件的样式都由qss设计 signal\slot 控件、窗体间通信,事件处理 QThread 异步处理 iconfont 阿里巴巴矢量图标库,主要用于按钮及标签上图标等显示 sqlite 存储数据库
源码的配套博文是 《【Visual C++】游戏开发笔记四十六 浅墨DirectX教程十四 模板测试与镜面特效专场》 ,文章地址为http://blog.csdn.net/zhmxy555/article/details/8632184, 点击Release下的exe文件可以直接...
源码的配套博文是 《【Visual C++】游戏开发笔记四十七 浅墨DirectX教程十五 翱翔于三维世界:摄像机的实现》 ,文章地址为http://blog.csdn.net/zhmxy555/article/details/8657656, 点击Debug下的exe文件可以...
源码的配套博文是 《【Visual C++】游戏开发笔记四十八 浅墨DirectX教程十六 三维地形系统的实现》 ,文章地址为http://blog.csdn.net/zhmxy555/article/details/8685546, 点击Release文件夹下的exe文件可以直接...
个人学习笔记 , 涵盖C , C++, Linux驱动, Linux内核, 嵌入式, 数据结构, 算法, QT, Android安卓, 音视频, 物联网 , 正在逐步更新 , 使用的typora编辑 , 大家可以使用 typora 打开查看 , 床图为 gitee Linux项目是一...
Python由荷兰数学和计算机科学研究学会的吉多·范罗苏姆于1990年代初设计,作为一门叫做ABC语言的替代品。 [1] Python提供了高效的高级数据...Python丰富的标准库,提供了适用于各个主要系统平台的源码或机器码。 [4]
Qt [1] 是一个1991年由Qt Company开发的跨平台C++图形用户界面应用程序开发框架。它既可以开发GUI程序,也可用于开发非GUI程序,比如控制台工具和服务器。Qt是面向对象的框架,使用特殊的代码生成扩展(称为元对象...
Vim 通常被称为“程序员的编辑器”,是一种老式的文本编辑器,主要涉及效率,灵活性和定制性。如果您是 Vim 的爱好者,并且当前正在...有关该项目的更多信息以及详细的文档部分,请参阅应用程序的官方 GitHub 存储库。