请选择 进入手机版 | 继续访问电脑版
分享 条款10: 如果写了operator new就要同时写operator delete
2017-7-6 15:02
让我们回过头去看看这样一个基本问题:为什么有必要写自己的operator new和operator delete? 答案通常是:为了效率。缺省的operator new和operator delete具有非常好的通用性,它的这种灵活性也使得在某些特定的场合下,可以进一步改善它的性能。尤其在那些需要动态分配大量的但很小的对象的应用程序里,情况更 ...
个人分类: C++高级编程|270 次阅读|0 个评论
分享 条款9: 避免隐藏标准形式的new
2017-7-6 14:39
因为内部范围声明的名称会隐藏掉外部范围的相同的名称,所以对于分别在类的内部 和全局声明的两个相同名字的函数f来说,类的成员函数会隐藏掉全局函数: void f(); ...
个人分类: C++高级编程|328 次阅读|0 个评论
分享 条款8: 写operator new和operator delete时要遵循常规
2017-7-6 14:38
自己重写operator new时(条款10解释了为什么有时要重写它),很重要的一点是函数提供的行为要和系统缺省的operator new一致。实际做起来也就是:要有正确的返回值;可用内存不够时要调用出错处理函数(见条款7);处理好0字节内存请求的情况。此外,还要避免不小心隐藏了标准形式的new,不过这是条款9的话题。 有关 ...
个人分类: C++高级编程|361 次阅读|0 个评论
分享 条款7:预先准备好内存不够的情况
2017-7-6 14:37
operator new在无法完成内存分配请求时会抛出异常(以前的做法一般是返回0,一些旧一点的编译器还这么做。你愿意的话也可以把你的编译器设置成这样。关于这个话题我将推迟到本条款的结尾处讨论)。大家都知道,处理内存不够所产生的异常真可以算得上是个道德上的行为,但实际做起来又会象刀架在脖子上那样痛苦。所以,你 ...
个人分类: C++高级编程|310 次阅读|0 个评论
分享 条款6:析构函数里对指针成员调用delete
2017-7-6 14:36
大多数情况下,执行动态内存分配的的类都在构造函数里用new分配内存,然后在析构函数里用delete释放内存。最初写这个类的时候当然不难做,你会记得最后对在所有构造函数里分配了内存的所有成员使用delete。 然而,这个类经过维护、升级后,情况就会变得困难了,因为对类的代码进行修改的程序员不一定就是最早写这个类的 ...
个人分类: C++高级编程|298 次阅读|0 个评论
分享 条款5:对应的new和delete要采用相同的形式
2017-7-6 14:35
下面的语句有什么错? string *stringarray = new string ; ... delete stringarray; 一切好象都井然有序——一个new对应着一个delete——然而却隐藏着很大的错误:程序的运行情况将是不可预测的。至少,stringarray指向的100个string对象中的99个不会被正确地摧毁,因为他们的析构函数永远不会被调用。 用 ...
个人分类: C++高级编程|316 次阅读|0 个评论
分享 条款4:尽量使用c++风格的注释
2017-7-6 14:34
旧的c注释语法在c++里还可以用,c++新发明的行尾注释语法也有其过人之处。例如下面这种情形: if ( a b ) { // int temp = a; // swap a and b // a = b; // b = temp; } 假设你出于某种原因要注释掉这个代码块。从软件工程的角度看,写这段代码的程序员也做得很好,他最初的代码里也写了一个注释 ...
个人分类: C++高级编程|265 次阅读|0 个评论
分享 条款3:尽量用new和delete而不用malloc和free
2017-7-6 14:33
malloc和free(及其变体)会产生问题的原因在于它们太简单:他们不知道构造函数和析构函数。 假设用两种方法给一个包含10个string对象的数组分配空间,一个用malloc,另一个用new:    string *stringarray1 = static_caststring*(malloc(10 * sizeof(string))); string *stringarray2 = new strin ...
个人分类: C++高级编程|275 次阅读|0 个评论
分享 条款2:尽量用<iostream>而不用<stdio.h>
2017-7-6 14:32
是的,scanf和printf很轻巧,很高效,你也早就知道怎么用它们,这我承认。但尽管他们很有用,事实上scanf和printf及其系列还可以做些改进。尤其是,他们不是类型安全的,而且没有扩展性。因为类型安全和扩展性是C++的基石,所以你也要服从这一点。另外,scanf/printf系列函数把要读写的变量和控制读写格式的信息分开来,就 ...
个人分类: C++高级编程|257 次阅读|0 个评论
分享 条款1: 尽量用const和inline而不用#define
2017-7-6 14:31
这个条款最好称为:“尽量用编译器而不用预处理”,因为#define经常被认为好象不是语言本身的一部分。这是问题之一。再看下面的语句: #define ASPECT_RATIO 1.653 编译器会永远也看不到ASPECT_RATIO这个符号名,因为在源码进入编译器之前,它会被预处理程序去掉,于是ASPECT_RATIO不会加入到符号列表中。如果涉及到这个 ...
个人分类: C++高级编程|250 次阅读|0 个评论 热度 10
12下一页
0351-8210788
周一至周日 9:00-18:00
意见反馈:mind@unigress.com
关注我们

扫一扫关注我们

Powered by Discuz! X3.4 Licensed  © 2001-2013 Comsenz Inc.( 晋ICP备12005011 )