Effective C++总结
条款1:尽量用const和inline而不用#define
本质是你想编译时就检查出错误,还是运行时出错。
const inline是编译期执行,有参数检查等动作,而#define是预编译时执行。
但是不能完全抛弃#define,它可以控制是否编译某段代码。
条款2:尽量用<iostream>而不用<stdio.h>
为什么呢,一个简单的原因是stdio的控制格式实在够烦人的,还有什么原因呢?
作者给出的原因很有深度“iostream具有类型安全和可扩展的特点,而stdio则没有此特点,类型安全和扩展性是C++的基石”。
什么是类型安全——类型安全很大程度上可以等价于内存安全,类型安全的代码不会试图访问自己没被授权的内存区域。
(一篇谈类型安全的不错的博文http://blog.csdn.net/btwsmile/article/details/6693178)
- int main()
- {
- printf("%f\n",10);
- system("pause");
- return 0;
- }
上面代码输出0.000000,这就是类型不安全!
那么扩展性指的是什么?——重载!
条款3:尽量用new和delete而不用malloc和free
malloc和free(及其变体)会产生问题的原因在于它们太简单:他们不知道构造函数和析构函数。
条款4:尽量使用c++风格的注释
该条款没多大意思,要注意的是/* */形式的注释不能嵌套。
C++风格的注释,指的是行注释。
条款5:对应的new和delete要采用相同的形式
new数组对应delete [].
string *stringptr1 = new string; string *stringptr2 = new string[100]; ... delete stringptr1;// 删除一个对象 delete [] stringptr2;// 删除对象数组
如果你在stringptr1前加了"[]"会怎样呢?答案是:那将是不可预测的;
如果你没在stringptr2前没加上"[]"又会怎样呢?答案也是:不可预测。而且对于象int这样的固定类型来说,结果也是不可预测的,即使这样的类型没有析构函数。
所以,解决这类问题的规则很简单:如果你调用new时用了[],调用delete时也要用[]。如果调用new时没有用[],那调用delete时也不要用[]。
条款6:析构函数里对指针成员调用delete
new和delete是一一对应的,可用auto_ptr智能指针解决忘记释放申请的内存问题。
条款7:预先准备好内存不够的情况
使用set_new_handler是处理内存不够情况下一种方便,简单的方法。