
Effective C++ 读书笔记
F_leo
山高人为峰!
展开
-
(1)尽量以const、enum、inline替换#define
一、对于 #define AS 1.6,通常用 const double ASI=1.6;来替换更好原因如下:(1)ASI肯定可以写被编译器看到,当然就会进入记号表内;(2)对浮点常量而言,使用常量可能比使用#define导致较小量的码;当我们以常量替换#defines,有两种特殊情况必须要说明:(1)定义常量指针,有必要将指针声明为 const。例如若要在头文件内原创 2016-05-16 19:26:24 · 455 阅读 · 0 评论 -
(10)复制对象时勿忘每一个成分
直接上图片吧!原创 2016-05-16 23:02:01 · 281 阅读 · 0 评论 -
(9)在 operator=中处理自我赋值
实际上两个对象只要来自同一个继承体系,它们甚至不需声明为相同类型就有可能造成“别名”,因为一个base class 的reference 或pointer 可以指向一个derived class 对象:原创 2016-05-16 22:07:53 · 252 阅读 · 0 评论 -
(8)绝不在构造和析构过程中调用virtual函数
你不该在构造函数和析构函数期间调用virtual函数,因为这样的调用会带来你意想不到的结果,就算有你也不高兴。1. base classes 构造期间virtual函数绝不会下降到derived classes 阶层。2. 在derived classes 对象的base classes 构造期间,对象类型是 base classes 而不是 derived classes。不只virtu原创 2016-05-16 19:38:17 · 266 阅读 · 0 评论 -
(7)别让异常逃离析构函数
C++并不禁止析构函数吐出异常,但它不鼓励你这样做。我们可以建立一个类通过调用来管理另外一个类。但问题是,如果在调用管理类的时候出现异常,那么无疑增加了更多的麻烦。为解决这个问题,我们有两种方案(46页)。请记住:1. 析构函数绝对不要吐出异常。如果一个被析构函数调用的函数可能抛出异常,析构函数应该捕捉任何异常。然后吞下它们(不传播)或者结束程序。2. 如果客户需要对某个操作函数运行期原创 2016-05-16 19:37:28 · 257 阅读 · 0 评论 -
(6)为多态基类声明virtual析构函数
在C++中,继承类对象经由一个基类指针被删除,而该基类带着一个non-virtual析构函数,其结果是未定义的—实际执行是通常发生的是对象的继承成分没有被销毁。解决办法:给基类一个virtual析构函数。因此引出了我们今天的主题。1. 任何类只要带有virtual函数都几乎确定应该也有一个virtual析构函数。如果类不含有virtual函数,通常便是它并不意图被用做一个基类。当类不企原创 2016-05-16 19:36:37 · 280 阅读 · 0 评论 -
(5)若不想使用编译器自动生成的函数,就该明确拒绝
可以将拷贝构造函数或者拷贝赋值运算符声明为private的来阻止某些函数的默认操作。一般而言这样做并不安全,因为成员函数和友元函数可以调用你的private函数。那么我们可以将它声明为private的并且不去定义它,那么我们的目的就可以达到了。我们可以专门为阻止copying动作而设计一个基类:class Uncopyable{protected:Uncopyable () { }原创 2016-05-16 19:35:21 · 249 阅读 · 0 评论 -
(4)了解C++默默编写并调用了哪些函数
如果你写下:class Empty { };这就好像你写下这样的代码:class Empty{public:Empty () {…} //默认构造函数Empty (const Empty &rhs) {…} //复制构造函数~Empty () {…} //析构函数Empty & operator=(const Empty &rhs) {…} //拷贝赋值运算符原创 2016-05-16 19:33:50 · 273 阅读 · 0 评论 -
(3)定对象被初始化前以先被初始化
永远在使用对象之前先将它初识化。1. 有些情况下即使面对的成员变量属于内置类型,也一定得使用初值列。如果成员变量是const或者reference,它们就一定需要初值,不能被赋值。2. C++有着十分固定的“成员初始化次序”。是的 ,次序总是相同的:基类更早于继承类被初识化,而类的成员变量总是以其声明次序被初始化。3. 所谓static对象,就是包括global对象、定义于namesp原创 2016-05-16 19:33:04 · 290 阅读 · 0 评论 -
(2)尽可能使用const
关键字 const 的一件奇妙事情是,它允许你指定一个语义约束,而编译器是强制实施这项约束。关键字const多才多艺。1. 关键字const出现在星号左边,表示被指物是常量;如果出现在星号右边,表示指针自身是常量;如果出现在星号两边,表示被指物和指针本身两者都是常量。注意:一下两种类型是一样的void f1 (const Widget * pw);void f2 (Widg原创 2016-05-16 19:31:35 · 266 阅读 · 0 评论 -
(11)以对象管理资源
这里写图片描述原创 2016-05-16 23:39:53 · 372 阅读 · 0 评论