您的位置:首页 > 编程语言 > C语言/C++

《Effective C++》总结

2013-11-27 16:06 316 查看
从C转向C++部分:

1.  条款1:尽量用const和inline而不用#define

1)  使用#defineNUM 1.5时,对应代码是预编译时检查,并将所有的NUM替换为1.5,这样在编译阶段如果有编译错误发生,会提示1.5而不是符号名NUM,不易检查。

内存管理部分:

2.  条款7:预先准备好内存不够的情况

1)  在动态申请内存时,要考虑到内存不能够申请的情况,这是往往会忽略的部分。

3.  条款6和条款11:为需要动态分配内存的类声明复制控制函数(拷贝构造函数、析构函数、赋值操作符重载)

1)  在动态分配内存时必须要定义控制函数,忽略拷贝构造函数和赋值操作符会很容易造成悬垂指针的情况,忽略析构函数会有内存泄露的风险;

2)  不管是否重载复制控制函数,默认复制控制函数都会调用(在执行重载的复制控制函数后执行);

3)  为避免野指针(悬垂指针)现象的发生,常用的方法是通过定义“智能指针”类或者定义值型类来解决;

4)  智能指针类:用户将动态分配一个对象并将该对象的地址传给新的HadPtr类。用户仍然可以通过普通指针访问对象,但绝不能删除指针。HasPtr类将保证在撤销指向对象的最后一个HasPtr对象时删除对象。

5)  在定义具有动态分配内存类的赋值操作符重载时,要考虑到赋值类是其自身的情况,还有内存不能够申请到的情况。

4.  条款14:确定基类有虚析构函数

1)  凡是基类要将析构函数设置为虚函数;

2)  虚析构函数符合虚函数的性质,在进行相关操作时为动态链接;而非虚函数调用是为静态链接。

5.  条款15:让operator= 返回*this的引用(包含其它的复制运算符的重载)

类和函数:设计与声明部分

6.  条款20:避免public接口出现数据成员

7.  条款22:尽量用“传引用”而不是传值;

1)  类对象的“传引用”可以减少构造函数和析构函数的开销;

2)  “传引用”避免了“切割”问题;当一个派生类的对象作为基类对象呗传递时,派生对象作为派生类具有的行为特性会被“切割”掉,从而变成了一个简单的基类对象。

3)  拷贝构造函数的形参必须为“传引用”,值传递会使得拷贝的过程进入到一个无休止的循环中。

8.  条款23:必须返回一个对象时不要试图返回一个引用

1)  通常而言,要将算数和关系操作符定义为非成员函数(成员函数,编译不能通过);

2)  当函数有诸如条款29和条款30这样的情况发生时,条款23是适用的。

类和函数:实现部分

9.  条款29:避免返回内部数据的句柄

10. 条款31:不要返回局部对象的引用,也不要返回函数内部用new初始化的指针的引用

11. 条款34:将文件间的编译依赖性降至最低

1)  在不需要类实现的部分不必包含对应类的头文件;

继承和面向对象设计部分

12. 条款36:区分接口继承和实现继承

1)  常见的情况有三种:纯虚函数、虚函数、非虚函数;

2)  含有纯虚函数的类为抽象类,派生类在定义时必须为其声明函数体;这种继承是接口继承;

3)  对于虚函数继承,这种接口必须继承,函数实现部分继承是可选的(可以通过重定义来覆盖原来的虚函数实现部分);

4)  非虚函数,其是实现继承,接口和函数体都会继承下来;即使重写函数体,从基类继承下来的函数和接口会隐藏而不会被覆盖

杂项部分:

13. 条款45:弄清c++在幕后为你缩写、所调用的函数

1)  构造函数、拷贝构造函数、析构函数、赋值运算符、取地址运算符。

14. 条款46:宁可编译和链接时出错,也不要运行时出错

15. 条款47:确保非局部静态对象在使用前被初始化

Reference:http://blog.csdn.net/yming0221/article/details/6249151

http://blog.csdn.net/hzh2007/article/details/7302688

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++