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

  1. int main()  
  2. {  
  3.     printf("%f\n",10);  
  4.     system("pause");  
  5.     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是处理内存不够情况下一种方便,简单的方法。

posted @ 2013-06-13 13:52  helloweworld  阅读(189)  评论(0编辑  收藏  举报