effective C++
yoyobaibai
这个作者很懒,什么都没留下…
展开
-
条款3:尽量用new和delete而不用malloc和free
<br /> <br /> 条款3:尽量用new和delete而不用malloc和free<br /> <br />malloc和free(及其变体)会产生问题的原因在于它们太简单:他们不知道构造函数和析构函数。<br />假设用两种方法给一个包含10个string对象的数组分配空间,一个用malloc,另一个用new:<br />string *stringarray1 = static_cast<string*>(malloc(10 * sizeof(string))); string原创 2010-10-23 15:57:00 · 108 阅读 · 0 评论 -
条款7:预先准备好内存不够的情况
<br /> <br /> 条款7:预先准备好内存不够的情况<br /> <br />operator new在无法完成内存分配请求时会抛出异常(以前的做法一般是返回0,一些旧一点的编译器还这么做。你愿意的话也可以把你的编译器设置成这样。关于这个话题我将推迟到本条款的结尾处讨论)。大家都知道,处理内存不够所产生的异常真可以算得上是个道德上的行为,但实际做起来又会象刀架在脖子上那样痛苦。所以,你有时会不去管它,也许一直没去管它。但你心里一定还是深深地隐藏着一种罪恶感:万一new真的产生了异常怎么办?转载 2010-10-23 16:01:00 · 115 阅读 · 0 评论 -
条款1:尽量用const和inline而不用#define
<br /> <br /> 条款1:尽量用const和inline而不用#define<br /><br />这个条款最好称为:“尽量用编译器而不用预处理”,因为#define经常被认为好象不是语言本身的一部分。这是问题之一。再看下面的语句: <br /> #define ASPECT_RATIO 1.653<br /><br />编译器会永远也看不到ASPECT_RATIO这个符号名,因为在源码进入编译器之前,它会被预处理程序去掉,于是ASPECT_RATIO不会加入到符号列表中。如果涉及到这个转载 2010-10-23 15:54:00 · 132 阅读 · 0 评论 -
条款4:尽量使用c++风格的注释
<br /> <br /> 条款4:尽量使用c++风格的注释<br /> <br />旧的c注释语法在c++里还可以用,c++新发明的行尾注释语法也有其过人之处。例如下面这种情形: <br /> if ( a > b ) { // int temp = a; // swap a and b // a = b; // b = temp; } <br />假设你出于某种原因要注释掉这个代码块。从软件工程的角度看,写这段代码的程序员也做得很好,他最初的代码里也写了一个注释,以解释代码在做原创 2010-10-23 15:58:00 · 127 阅读 · 0 评论 -
条款6:析构函数里对指针成员调用delete
<br /> <br /> 条款6:析构函数里对指针成员调用delete<br /> <br />大多数情况下,执行动态内存分配的的类都在构造函数里用new分配内存,然后在析构函数里用delete释放内存。最初写这个类的时候当然不难做,你会记得最后对在所有构造函数里分配了内存的所有成员使用delete。<br />然而,这个类经过维护、升级后,情况就会变得困难了,因为对类的代码进行修改的程序员不一定就是最早写这个类的人。而增加一个指针成员意味着几乎都要进行下面的工作:<br /> ·在每个构转载 2010-10-23 16:00:00 · 118 阅读 · 0 评论 -
条款10: 如果写了operator new就要同时写operator delete
<br /> <br /> 条款10: 如果写了operator new就要同时写operator delete<br /> <br />让我们回过头去看看这样一个基本问题:为什么有必要写自己的operator new和operator delete?<br />答案通常是:为了效率。缺省的operator new和operator delete具有非常好的通用性,它的这种灵活性也使得在某些特定的场合下,可以进一步改善它的性能。尤其在那些需要动态分配大量的但很小的对象的应用程序里,情况更是如此。<转载 2010-10-23 16:03:00 · 110 阅读 · 0 评论 -
条款2:尽量用而不用
<br /> <br /> 条款2:尽量用<iostream>而不用<stdio.h><br /> <br />是的,scanf和printf很轻巧,很高效,你也早就知道怎么用它们,这我承认。但尽管他们很有用,事实上scanf和printf及其系列还可以做些改进。尤其是,他们不是类型安全的,而且没有扩展性。因为类型安全和扩展性是C++的基石,所以你也要服从这一点。另外,scanf/printf系列函数把要读写的变量和控制读写格式的信息分开来,就象古老的FORTRAN那样。是该向五十年代说诀别的时候原创 2010-10-23 15:55:00 · 101 阅读 · 0 评论 -
条款8: 写operator new和operator delete时要遵循常规
<br /> <br /> 条款8: 写operator new和operator delete时要遵循常规<br /> <br />自己重写operator new时(条款10解释了为什么有时要重写它),很重要的一点是函数提供的行为要和系统缺省的operator new一致。实际做起来也就是:要有正确的返回值;可用内存不够时要调用出错处理函数(见条款7);处理好0字节内存请求的情况。此外,还要避免不小心隐藏了标准形式的new,不过这是条款9的话题。<br />有关返回值的部分很简单。如果内存分配转载 2010-10-23 16:01:00 · 122 阅读 · 0 评论