《EffectiveC阅读笔记

发布 2021-05-02 19:00:28 阅读 8012

第一章:让自己习惯c++

1、视c++为一个语言联邦。

a、c++由四个部分组成: c、object-oriented c++、template c++、stl。

b、每一个部分有自己独立的高效编程守则。

2、用const、enum、inline代替#define

a、#define是预处理器处理的部分,当编译出错时,不容易发现错误发生在**,其次由于预处理器盲目的替换,会导致目标码的增大。

b、定义常量指针时采用如下两种方法: const char* const ptr = hello world“、const std::string ptr(”hello world“)

c、#define并不重视作用域,所以无法定义class中常量变量。

d、对于类中常量,某些编译器不允许声明时进行初值设定,而类其他成员依赖这个常量,可以采用enum来实现。

e、用inline来代替形似函数的宏

3、尽可能的使用const

a、char* const ptr、const char* ptr、char const *ptr、和const char* const ptr的含义。

b、const成员函数的作用:使接口容易被理解、消除误操作的隐患、使操作const对象成为可能。

c、两个成员函数如果只有常量性不同,可以被重载。

d、当const与non-const发生重复时,可以使用non-const版本调用const(使用const_cast和static_cast)

4、确定对象使用前已经初始化。

a、为内置型对象进行手工初始化,因为c++不保证初始化它们;

b、构造函数最好使用成员初值列,而不是在构造函数本体内进行复制操作,初值列列出的成员变量,其排列顺序应该跟声明相同。

c、以local static对象代替non-local static对象;

第二章:构造/析构/赋值运算。

5、了解c++默默地编写了并调用哪些函数。

a、default构造函数,复制构造函数,赋值操作符,析构函数;

b、如果是一个独立的类,上面的函数默认为public,如果是一个派生类,上面的函数与基类保持一致。

c、如果类里面有引用变量,则default构造函数,赋值操作符都无效;

6、若不想编译器自动生成函数,就应该明确的拒绝。

a、因为默认的上述四个函数都是public,我们可以只显示的声明他们,而不去实现他们,并且将它们定义为private; 不实现他们是因为成员函数和友元函数可以访问private;如果不实现他们,而在成员函数或友元函数调用它的时候,就会提示连接错误。

b、还有一种方式就是定义一个上述这样的基类,然后不干其他的事,如果你需要其他的类来拒绝默认函数,就直接继承这个基类就可以了。

7、为多态基类声明虚析构函数。

a、我们知道,虚函数的作用主要体现在当用表面上是基类指针,实际上市指向派生类对象进行操作的时候,在这种情况下,当我们销毁对象时,如果不是虚函数,就会造成基类部分被释放,派生类部分不被释放的局部销毁情况。

b、带有多态性质的基类应该声明虚析构函数;如果一个类中有一个以上的虚函数,则应该声明虚析构函数。

c、类不是作为基类用,或不具备多态性,就不应该声明虚析构函数。

8、别让异常逃离析构函数。

a、析构函数绝对不要吐出异常,如果一个析构函数调用的函数可能会抛出异常,那么析构函数应该吞掉它们(不传播)或是结束程序。

b、如果客服需要对某个操作函数运行期间可能抛出的异常做反应,那么class应该提供一个普通的成员函数(而不是在析构函数中)执行该操作。

9、绝不在构造和析构函数中调用虚函数。

a、简单的理解就是基类的构造函数在调用时派生类还没有创建,所以试图实现这种多态是不可能的,对于析构函数一样,因为派生类对象已经销毁。

10、令operator=返回一个reference *this

a、与内置内型和标准库共同遵守。

11、在operator=中处理自我赋值。

a、确保对象在进行自我赋值时operator=有良好的行为,具体的方法有比较**和目标的地址,正确的语句顺序、copy-and-swap

b、确定一个函数在操作多个对象是,而多个对象实际上是同一个对象,其行为仍然正确。

12、复制对象时勿忘复制每一个成分。

a、编译器会提供默认的copy构造函数和copy assignment操作符。如果我们认为默认的copy函数无法满足我们要求时,我们必须重写这两个函数,在重写这两个函数时,对于对象里面每个成分都要显示的进行复制。

b、在有继承关系的类中,对于自己写的赋值构造函数,如果在派生类构造函数中只对派生类成员进行了复制的话,会导致部分复制的错误,因为这个时候派生来不会调用基类的复制构造函数进行构造,而是会调用无参数的构造函数进行构造,这样基类的成员就没有复制下来,所以在派生类中要显示的加上基类的复制构造函数。

c、不要尝试一个copying函数调用另一个copying函数,因为我们无法知道在copying函数幕后到底工作了什么,而是可以将共同的部分交由第三个函数,然后copying函数共同调用这个函数。

第三章:资源管理。

13、以对象管理资源。

a、当我们在一个函数开始时候new出来一个类对象,在函数结束时delete这个对象,并不是总能释放掉这块资源,因为在new和delete之间可以有return和goto等控制语句,导致执行不到delete,还有就是当中间有异常发生时,正常的控制流被终止,也不会执行到delete,这样就导致了资源的泄露。

b、为防止资源泄露,应该使用raii对象,它们在构造函数中获得资源并在析构函数中释放资源。

c、两个常用的raii class分别是trl::shared_ptr和auto_ptr,注意两者的区别。

14、在资源管理类中小心copying行为。

a、复制raii对象必须一并复制它所管理的资源,并以资源的copying行为决定raii对象的copying行为。

b、普通而常见的raii class copying行为有:抑制copying、引用计数法。

15、在资源管理类中提供对原始资源的访问。

a、api往往要求访问原始资源,所以每一个raii class应该提供一个“取得其所管理的资源”的方法。

b、对原始资源的访问有两种方式,显示和隐示。

16、成对使用new和delete要采用相同的形式。

a、如果你在new表达式的时候采用了,必须在相应的delete表达式加上;如果你在new表达式的时候没有采用,在在相应的delete表达式一定不要加上。

b、如下**: typedef t a[4]; t* pa = new a; 则要使用delete;因为new a 返回一个t*指针,就像new t[4]一样。注:

t表示一个对象。

17、以独立语句将newed对象置入智能指针中。

a、以独立语句将newed对象置入智能指针中,如果不这么做,一旦异常被抛出,可能导致难以察觉的资源泄露。

第四章:设计与声明。

18、让接口容易正确使用,不易被勿用。

a、好的接口应该容易使用,不易被勿用,在设计接口时应该努力达到这点。

b、要保持接口的一致性,以及与内置类型的行为相同。

c、阻止勿用的措施有建立新类型,限制类型上的操作,束缚对象值以及消除客户的资源管理责任。

d、trl::shared_ptr支持定制性删除器。

19、设计class应该考虑的问题。

a、class如何被创建和销毁构造函数和析构函数的写法,以及new delete操作符的运用相关问题。

b、对象的初始化和对象的赋值之间的差别---构造函数和赋值操作符的行为,以及成员初始化列表相关问题。

c、对象以pass-by-value意味着什么copy构造函数的实现、用来作为pass-by-value之用。

d、新类的合法值错误检查机制。

e、是否配后某个集成类图是否为基类或是子类或不包含继承关系的类。

f、新类需要什么样的转换是否需要类型转换函数。

g、什么样的操作符和函数对该类是合理的---成员函数的依据。

h、什么样的函数调用应该驳回申明为private类型的依据。

i、新类的成员属性成员变量的public、private、和protect属性。

j、新类的一般性考虑是否写成模板类。

20、用pass-by-reference-to-const替换pass-by-value

a、默认情况下,c++采用pass-by-value来进行函数参数的传递。

b、pass-by-value由于有对象的赋值以及构造函数、析构函数的调用,会造成内存的增大,效率的下降,同时在将派生类作为基类函数参数传递时,会造成派生类数据截断。

c、对于内置类型、stl迭代器和函数对象,一般采用pass-by-value

21、必须返回对象时,别妄想返回reference

a、如果在函数内定义对象,即在stack上创建对象,然后再返回改对象的引用,这样可以避免返回参数时候的构造开销,但问题是随着函数的执行完成,对象的生命周期结束,对象也就自动销毁了,返回的引用也就指向了一个销毁了的对象,会产生不明确行为。

b、如果在heap上创建对象,返回指针,这样一种策略会导致new 和delete分属不同的使用者,极容易导致内存泄露。

c、定义静态对象,返回引用,这样一种策略也会导致隐患。比如说一个重载乘法的操作符,当执行下面语句时if(a*b ==c*d)就会产生不符合预期的效果。其实对于多线程也会产生不符合预期的结果。

d、采用返回对象的方式会有对象构造的开销,但相对于上述的不安全行为,这样一种开销是值得的。

阅读笔记格式阅读笔记格式

阅读笔记格式 阅读笔记格式4篇。读书笔记一则。文。题。每个人都是一扇窗。作。者。田。野。语文知识积累。好词。碧野飞花。伤天暮景。惨淡愁云。和风徐徐。春意盎然。热情洋溢。好句。和不同的人交往,就像打开一扇不同的窗子。然而,就像蜜蜂永远迷恋花丛,就像花儿永远期待春光。我们每个人都希望结识一个优秀的朋友,...

英语阅读笔记

考研英语阅读笔记。第一,扫描提干,划关键项。第二,通读全文,抓住中心。1.通读全文,抓两个重点 首段 中心句 核心概念常在第一段,常在首段出题 其他各段的段首和段尾句。其他部分略读,有重点的读 2.抓住中心,用一分半时间思考3个问题 文章叙述的主要内容是什么?文章中有无提到核心概念?作者的大致态度是...

阅读笔记格式

判断 文章结构类型,给出判断方法。标记 3.态度。4.事物之间的关系。5.事物的缺陷。句。7.列举。8.强对比。9.专有名词首次出现的句子。10.与文章密切相关的词汇。详读 1.标记的地方。2.让步句 强调句后面的转折。3.出现be driven to,purpose of等固定短语的句子。4.特殊...