Fork me on GitHub

随笔分类 -  Effective c++

摘要:历时两个多月的时间,终于把effective c++又复习了一遍,比较慢,看的是英文版,之前看的时候做过一些笔记,但不够详细,这次笔者是从头到尾的翻译了一遍,加了一些标题,先记录到word里面,然后发布到博客园上。这么做是为了方便查阅,复习C++,同时练习英文,希望这些帖子也能够对大家有所帮助。 有 阅读全文
posted @ 2017-04-25 07:46 HarlanC 阅读(2483) 评论(0) 推荐(4) 编辑
摘要:你正在寻找一个高质量的,开源的,与平台和编译器无关的程序库的集合?看一下Boost吧。想加入一个由雄心勃勃的,充满天赋的正致力于最高水平的程序库设计和实现工作的C++程序员们组成的团体么?看一下Boost吧。想了解C++将来可能会是什么样子的?看一下Boost吧。 Boost是一个C++开发人员组成 阅读全文
posted @ 2017-04-25 07:43 HarlanC 阅读(694) 评论(0) 推荐(0) 编辑
摘要:1. C++0x的历史渊源 C++标准——也就是定义语言的文档和程序库——在1998被批准。在2003年,一个小的“修复bug”版本被发布。然而标准委员会仍然在继续他们的工作,一个“2.0版本”的C++标准预计在2009年被发布(虽然所有的工作很有可能在2007年底被完成)。直到现在,发布下一版C+ 阅读全文
posted @ 2017-04-23 18:21 HarlanC 阅读(504) 评论(0) 推荐(0) 编辑
摘要:许多程序员常常忽略编译器发出的警告。毕竟,如果问题很严重,它才将会变成一个error,不是么?相对来说,这个想法可能在其它语言是无害的,但是在C++中,我敢打赌编译器的实现者对于对接下来会发生什么比你有更好的理解。例如,下面的错误是每个人都时不时会犯的: 1. 你对警告的理解可能是错的 你的想法是用 阅读全文
posted @ 2017-04-22 18:55 HarlanC 阅读(485) 评论(0) 推荐(0) 编辑
摘要:1. 调用普通版本的operator new抛出异常会发生什么? Placement new和placement delete不是C++动物园中最常遇到的猛兽,所以你不用担心你对它们不熟悉。当你像下面这样实现一个new表达式的时候,回忆一下Item 16和Item 17: 两个函数会被调用:一个是调 阅读全文
posted @ 2017-04-22 12:59 HarlanC 阅读(775) 评论(0) 推荐(0) 编辑
摘要:Item 50中解释了在什么情况下你可能想实现自己版本的operator new和operator delete,但是没有解释当你实现的时候需要遵守的约定。遵守这些规则并不是很困难,但是它们其中有一些并不直观,所以知道这些规则是什么很重要。 1. 定义operator new的约定 1.1 约定列举 阅读全文
posted @ 2017-04-21 08:01 HarlanC 阅读(761) 评论(0) 推荐(1) 编辑
摘要:1. 自定义new和delete的三个常见原因 我们先回顾一下基本原理。为什么人们一开始就想去替换编译器提供的operator new和operator delete版本?有三个最常见的原因: 为了检测内存使用错误。不能成功delete new出来的内存会造成内存泄漏。在new出来的内存上使用多于一 阅读全文
posted @ 2017-04-19 08:00 HarlanC 阅读(655) 评论(0) 推荐(0) 编辑
摘要:1. new-handler介绍 当操作符new不能满足内存分配请求的时候,它就会抛出异常。很久之前,它会返回一个null指针,一些旧的编译器仍然会这么做。你仍然会看到这种旧行为,但是我会把关于它的讨论推迟到本条款结束的时候。 1.1 调用set_new_handler来指定全局new-handle 阅读全文
posted @ 2017-04-17 08:01 HarlanC 阅读(1124) 评论(0) 推荐(1) 编辑
摘要:1. TMP是什么? 模板元编程(template metaprogramming TMP)是实现基于模板的C++程序的过程,它能够在编译期执行。你可以想一想:一个模板元程序是用C++实现的并且可以在C++编译器内部运行的一个程序,它的输出——从模板中实例化出来的C++源码片段——会像往常一样被编译 阅读全文
posted @ 2017-04-15 12:54 HarlanC 阅读(884) 评论(1) 推荐(1) 编辑
摘要:STL主要由为容器,迭代器和算法创建的模板组成,但是也有一些功能模板。其中之一叫做advance。Advance将一个指定的迭代器移动指定的距离: 从概念上来说,advance仅仅做了iter += d,但是advance并不是用这种方式实现的,因为只有随机访问迭代器支持+=操作。其他一些更加弱的迭 阅读全文
posted @ 2017-04-13 08:40 HarlanC 阅读(1182) 评论(0) 推荐(2) 编辑
摘要:1. 问题的引入——将operator*模板化 Item 24中解释了为什么对于所有参数的隐式类型转换,只有非成员函数是合格的,并且使用了一个为Rational 类创建的operator*函数作为实例。在继续之前建议你先回顾一下这个例子,因为这个条款的讨论是对它的扩展,我们会对Item 24的实例做 阅读全文
posted @ 2017-04-11 08:38 HarlanC 阅读(806) 评论(0) 推荐(0) 编辑
摘要:智能指针的行为像是指针,但是没有提供加的功能。例如,Item 13中解释了如何使用标准auto_ptr和tr1::shared_ptr指针在正确的时间自动删除堆上的资源。STL容器中的迭代器基本上都是智能指针:当然,你不能通过使用“++”来将链表中的指向一个节点的内建指针移到下一个节点上去,但是li 阅读全文
posted @ 2017-04-10 08:36 HarlanC 阅读(748) 评论(0) 推荐(0) 编辑
摘要:1. 使用模板可能导致代码膨胀 使用模板是节省时间和避免代码重用的很好的方法。你不需要手动输入20个相同的类名,每个类有15个成员函数,相反,你只需要输入一个类模板,然后让编译器来为你实例化20个特定的类和300个你需要的函数。(只有在被使用的情况下类模版的成员函数才会被隐式的实例化,所以只有在30 阅读全文
posted @ 2017-04-07 22:01 HarlanC 阅读(1028) 评论(0) 推荐(0) 编辑
摘要:1. 问题的引入——派生类不会发现模板基类中的名字 假设我们需要写一个应用,使用它可以为不同的公司发送消息。消息可以以加密或者明文(未加密)的方式被发送。如果在编译阶段我们有足够的信息来确定哪个信息会被发送到哪个公司,我们可以使用基于模板的解决方案: 这会工作的很好,但是假设有时候我们需要在发送信息 阅读全文
posted @ 2017-04-04 18:20 HarlanC 阅读(762) 评论(0) 推荐(0) 编辑
摘要:1. class和typename含义相同的例子 问题:在下面的模板声明中class和typename的区别是什么? 答案:没有任何区别。当声明一个模板类型参数时,class和typename意味着相同的事情。一些程序员喜欢使用class,因为容易敲打。其他的(包括我)更加喜欢使用typename, 阅读全文
posted @ 2017-04-03 08:15 HarlanC 阅读(1163) 评论(1) 推荐(0) 编辑
摘要:1. 显示接口和运行时多态 面向对象编程的世界围绕着显式接口和运行时多态。举个例子,考虑下面的类(无意义的类), 考虑下面的函数(同样没有意义), 对于doProcessing中的w,我们可以这样说: 因为w被声明为Widget类型,w必须支持Widget接口。我们可以在源码中搜寻这个接口(例如,在 阅读全文
posted @ 2017-03-30 22:56 HarlanC 阅读(869) 评论(0) 推荐(0) 编辑
摘要:1. 多继承的两个阵营 当我们谈论到多继承(MI)的时候,C++委员会被分为两个基本阵营。一个阵营相信如果单继承是好的C++性质,那么多继承肯定会更好。另外一个阵营则争辩道单继承诚然是好的,但多继承太麻烦,而不值得去使用它。在这个条款中,我的主要目标是让你明白多继承的这两个观点。 2. 从多个基类中 阅读全文
posted @ 2017-03-29 21:23 HarlanC 阅读(1003) 评论(0) 推荐(0) 编辑
摘要:1. private 继承介绍 Item 32表明C++把public继承当作”is-a”关系来对待。考虑一个继承体系,一个类Student public 继承自类Person,如果一个函数的成功调用需要从Student到Person的隐式转换,这时候“is-a”关系就出现了。对于一部分实例,使用p 阅读全文
posted @ 2017-03-28 21:14 HarlanC 阅读(926) 评论(0) 推荐(1) 编辑
摘要:1. 什么是组合(composition)? 组合(composition)是一种类型之间的关系,这种关系当一种类型的对象包含另外一种类型的对象时就会产生。举个例子: 在这个例子中,Person对象由string,Address和PhoneNumber对象组成。对于程序员来说,术语组合(compos 阅读全文
posted @ 2017-03-27 20:36 HarlanC 阅读(990) 评论(0) 推荐(0) 编辑
摘要:从一开始就让我们简化这次的讨论。你有两类你能够继承的函数:虚函数和非虚函数。然而,重新定义一个非虚函数总是错误的(Item 36),所以我们可以安全的把这个条款的讨论限定在继承带默认参数值的虚函数上。 1. 虚函数是动态绑定的,而默认参数是静态绑定的 在这种情况下,这个条款的验证就相当直接了:虚函数 阅读全文
posted @ 2017-03-25 17:50 HarlanC 阅读(1016) 评论(2) 推荐(1) 编辑

点击右上角即可分享
微信分享提示