图书介绍
最优C/C++编程秘诀pdf电子书版本下载
- (美)Anthony Porter著;秦冬雷等译 著
- 出版社: 北京:电子工业出版社
- ISBN:7505331337
- 出版时间:1995
- 标注页数:326页
- 文件大小:10MB
- 文件页数:342页
- 主题词:
PDF下载
下载说明
最优C/C++编程秘诀PDF格式电子书版下载
下载的文件为RAR压缩包。需要使用解压软件进行解压得到PDF格式图书。建议使用BT下载工具Free Download Manager进行下载,简称FDM(免费,没有广告,支持多平台)。本站资源全部打包为BT种子。所以需要使用专业的BT下载软件进行下载。如 BitComet qBittorrent uTorrent等BT下载工具。迅雷目前由于本站不是热门资源。不推荐使用!后期资源热门了。安装了迅雷也可以迅雷进行下载!
(文件页数 要大于 标注页数,上中下等多册电子书除外)
注意:本站所有压缩包均有解压码: 点击下载压缩包解压工具
图书目录
第一部分 C和C+++语言 3
第一章 十种避免常见C语言编程错误的方法 3
1、在使用所有数据之前须先将其初始化 4
2、不能将堆栈里的对象作为指针返回值 4
3、当给字符串分配空间时,不要忘记空字符“ ” 5
4、请注意数组的最后一个元素的序号值比该数组的大小少一 5
5、使用函数原型 6
6、在表达式中使用char类型时要小心 7
7、不要混淆逻辑运算符与位运算符 8
8、不要依赖表达式的运算次序 9
9、函数形参的运算次序没有定义 10
10、不要混淆“=”和“==”运算符 10
第二章 标识符与数据 11
11、不要用C+++的关键词作为C语言程序的标识符 12
12、避免标识符含有双下划线或以下划线作为标识符的起始符 12
13、避免临时定义 12
14、如何编排长字符串 13
15、文件路径要用双反斜杠来表示 13
16、在一字符串中加入十六进制常数时要谨慎 13
17、转义符必须小写 14
18、何时需在问号(?)前加转义符 14
19、何时使用三元符 14
20、如果编辑器和程序使用同一扩展字符集则可以在字符串中使用扩展字符 15
21、对于小整数使用char型定义,效果并不好 15
22、枚举类型常量比#define语句更方便 15
24、数组在函数调用时是作为指针传递的 17
23、当说明一个enum型的变量时没有必要使用enum关键字 17
25、只有针对函数的形式参数而言,数组与数组的指针是等价的 18
26、如果形式参数是多维数组,须定义其大小 18
27、对于多维数组形式参数,第一维的大小是随意的 19
28、不恰当的对大型多维数组的操作会导致系统颠簸 19
29、允许超出数组一个单位的元素,但只能是超出一个 20
30、下标运算符位置可以交换 20
31、C语言没有定义一种决定数组边界的方式 21
32、如果变量或函数在一模块中是私有的,将其定义为static型 22
33、一个函数内部的static型数据项在多个函数调用期间将被保存 22
34、对于内部初始化的数组,static型数组很有用 23
36、const修饰符单独使用同const int等价 24
35、如果不允许函数修改一个数组参数,那么将其说明为const型 24
37、怎样说明常量指针 25
38、使用现代编译器后没有必要再用register说明 25
39、何时使用volatile修饰符 26
40、一个变量可同时说明为const和volatile 26
41、在一条语句中定义几个指针时,要谨慎 26
第三章 函数与运算符 29
42、如果函数没有形式参数,应将其原型说明为void 30
43、传统函数定义将float类型视为double型 30
44、main函数应返回一个结果 31
45、读程序命令行参数 31
46、尽可能不要使用递归函数 32
47、如果函数没有返回,说明其为void 33
49、避免对浮点数进行相等比较 34
48、对定点数应避免使用浮点运算 34
50、谨慎整数表达式中会出现暂时溢出 35
51、避免在除法运算中混合使用符号数与无符号数 35
52、如果一个除法式中两个操作之一是负数,那么其结果的取整值取决机器的运行 36
53、避免进行符号与无符号数的比较 36
54、逻辑运算是从左向右进行求值直至获得表达式的值 36
55、逻辑非运算符!在测试是否为零时非常有效 37
56、赋值号可以连在一起 37
57、了解前缀“+++、--”与后缀“+++、--”的不同之处 38
58、位运算符对存储标志很有用处 38
59、给字中的某些位消零,使用取反运算符 39
60、要反置一位,可用异或运算符 39
61、怎样使用位运算符压缩小数值 40
62、算术移位与逻辑移位的区别 41
63、认清赋值运算符 41
64、条件表达式作为函数参数特别有效 42
65、条件表达式的优先级较低 43
66、位运算的优先级低于关系运算符 43
67、在C语言中,分程序块标识符对函数内变量的局部化十分有效 43
68、在一个嵌套的if语句中,else语句与其前的if语句相匹配 44
69、switch语句比嵌套if—else语句更有效 45
70、break语句放在switch语句中最后一个case语句后 46
71、可在while循环体内初始化和测试变量 46
72、逗号运算符可用于for循环内多于一个循环变量的处理情况 47
73、不要混淆break与continue语句 47
75、for循环中的初始表达式是可任意的 48
74、通过检验循环变量可以判断循环语句是否执行了break语句 48
76、自加符“+++”只增加指针的值,而不增加指针所指向内容的值 49
77、当查询一数组时,使用数组指针要比使用数组下标更迅速 49
78、当有嵌套时,数组指针比多维数组更有效 50
79、使用函数指针作为回调 51
80、用typedef来定义函数指针 52
81、理解复杂的说明 52
82、使用typedef来命名一个结构 53
83、ANSIC允许结构赋值 54
84、当想传递一指针时,不要无意中传递结构参数 54
85、如果要给数组赋值,请将其置于结构中 55
86、当存储标志时,位字段提供另一种屏蔽方法 55
87、可用位字段存储小的数值 56
89、谨慎未初始化的指针 57
88、位字段是运行依赖的 57
90、C语言不允许做指针加法,但可以做减法 58
91、弄清当指针加1时,将会发生什么 58
92、空指针 59
93、null指针不必每位都是零 60
94、在ANSIC对void型指针使用类型转换 60
95、何时使用多级指针 61
第四章 C+++说明语句 63
96、在C+++中,当定义变量时,没有理由不将其初始化 64
97、怎样使用缺省形式参数 64
98、用缺省形参来扩展一个已非常广泛使用的函数 64
99、可在for和while条件语句中说明循环变量 65
100、如果在for和while条件语句中说明变量,那么它在该语句后的作用域内仍有效 65
102、如果在一case语句中初始化变量,那么须将此case语句封闭在一个块中 66
101、一个变量若是定义在条件语句内,则不能在该条件语句作用域外被访问 66
104、∷运算符可存取隐含在当前作用域中的数据项 67
103、在C+++语言中,可取出一个寄存器的变量地址 67
105、条件运算符可写在表达式的左边 68
106、可以从普通C的structure中导出class(类) 69
107、使用引用(reference)作为函数的形参 70
108、使用引用作为返回类型 71
109、处理出现在返回reference型函数中的错误条件值 71
110、何时使用内联函数 72
111、定义在类说明语句中的函数自动设置为内联函数 73
112、使用内联函数来访问一些私有成员 73
113、隐含类数据可方便地改变程序执行 73
114、引用型成员函数可读写成员 75
116、何时使用虚拟(Virtual)函数 76
115、如何在类库中使用已被保护的成员 76
117、一般情况下,不要说明函数为Virtual型 78
118、对于导出类的Virtual函数没有必要使用Virtual关键词 78
119、在使用Virtual函数时一个常见的错误就是仅在某一类中改变形参类型 79
120、使用带有纯Virtual函数的抽象类 79
121、纯虚拟函数可以被定义 80
122、必须在导出类中重新定义所有纯Virtual函数,否则导出类将也是抽象的 81
123、如果纯Virtual函数非正确导出,编译器将会指出错误 81
124、当不使用Virtual函数全部形参时,如何避免警告 82
125、基本类中应含有虚拟析构函数(Virtual Destructor) 83
126、当没有一个导出类含有Destructor时,基本类可省略Virtual Destructor 83
127、弄清成员指针 83
128、如何使用指向成员函数的指针 84
129、对非静态函数运用Callbacks 85
130、使用Template来实现成员函数指针 87
131、说明静态类成员 89
132、不要在头文件中给出静态数据定义 89
133、静态成员函数仅能访问静态数据 89
134、使用静态指针来指定活动的对象 90
135、使用全静态类来组合函数 90
136、Const可取代#define或enum语句 91
137、如何在类中说明数组的大小 92
138、C+++的程序怎样调用C函数 92
139、如何使头文件在C与C+++中可移植 93
第五章 创建和撤消C+++对象 95
141、C+++允许删除空指针 96
140、怎样使用New和Delete会导致内存泄漏 96
142、当在一个类中使用指针时,应在构造函数中首先将它们置成空指针,然后在析构函数中将它们删除 97
143、当一个类包含指针成员时,在类中说明一个拷贝构造函数和一个赋值运算符 98
144、书写赋值运算符时,牢记X=X 100
145、拷贝构造函数可以调用赋值运算符 100
146、当类无须拷贝时,说明拷贝运算符为私有,而无须对它们定义 101
147、在重定义赋值运算符时,必须拷贝所有的成员 101
148、赋值运算符不能被继承 103
149、除了在构造函数中,其它情况下给指针赋值前,都必须删除原先的内容 104
150、如果在析构函数以外释放指针,应紧随其后将该指针置为空指针 104
151、可为类提供一个初始化函数,而不必使用构造函数 105
152、试图使New和Delete运算符局限于一个单独类中 106
153、如何将New和Delete重新定义为全局运算符 108
154、一个类可以有自己的New和Delete运算符 109
155、一个重载的Delete运算符能够接受一个任意大小的参数 110
156、如何为New运算符指定布局参数 111
157、当类重新定义使用布局参数的New运算符时,它也应提供一个不带参数的New运算符 112
158、如何在一个固定分配缓冲区分配类对象 113
159、在重新定义New运算符时,也需重新定义Delete运算符 114
160、当New运算符被重新定义时,如何重新定义Delete运算符 114
161、全局New常用于创建对象数组,即使类重新定义了New运算符 116
162、用Delete[]运算符撤消数组 116
163、一个重定义的New和Delete运算符如何处理导出类 117
164、如何重定义New去查找内存泄漏 118
165、为特定类优化New 119
166、对于虚拟存储系统,New函数怎样会导致系统颠簸 121
167、重载new而不使用set-new-handler 121
168、若一个类不含显式构造函数,编译程序将提供缺省的构造函数 122
169、说明带参数的构造函数,将屏蔽缺省的构造函数 122
170、一个带有缺省参数的构造函数等同于缺省的构造函数 123
171、当类已屏蔽缺省构造函数时,导出类必须提供构造函数 124
172、即使基本类型也有构造函数 124
173、如何构造临时对象 125
174、避免在函数调用时,创建临时对象 125
175、不要从同一类的另一构造函数中调用缺省构造函数 126
176、理解拷贝构造函数 127
177、拷贝构造函数必须带常量参数 127
179、虚拟构造函数 128
178、拷贝构造函数可以带有另外的缺省参数 128
180、一个虚拟构造函数的虚拟模拟函数 129
181、为什么一个析构函数未被调用 130
182、如何在一个构造函数的初始化表中,对成员项初始化 131
183、不能使用初始化表初始化导出类成员 134
184、如何显式调用析构函数 134
185、自动类型的对象仅当超出它们所在的块时被撤消 135
186、当临时对象不再被调用时,它们将被释放 136
187、尽早使用一个程序块去撤消自动型对象 136
188、确保全局对象在使用前被初始化 137
第六章 类型转换和重载 139
189、转换成类 140
190、一个带有缺省参数的构造函数也能用作类型转换 140
192、将类转换成另一类型 141
191、用类型赋值运算符来避免创建临时对象所产生的额外开销 141
193、如有可能,仅为基本类型和库函数提供转换运算符 142
194、如在两类间既说明了一个转换运算符又说明了一个转换构造函数,将可能产生二义性 143
195、记住转换运算符也可以是虚拟的 143
196、当说明类型转换及重载表达式时,请注意二义性问题 143
197、警惕过多使用类型转换 144
198、什么时候重载函数 144
199、当调用重载函数时,使用常量后缀 146
200、当调用重载函数时避免二义性 146
201、Const特性对于区分重载函数的参数已足够了 147
202、对象的Const特性已足够区分重载的成员函数 147
203、切记,函数重载不可通过函数指针完成 148
204、用重载代替缺省参数 149
205、用重载函数设置或返回类中成员值 150
206、运算符表 151
207、什么时候重载运算符 151
208、注意运算符的运算优先级 151
209、将二元运算符定义为友元函数 152
210、=、()、[]和->运算符必须是成员函数 153
211、将运算符参数说明为常量引用 154
212、前缀和后缀自加与自减运算符的差异 154
213、前缀运算符对自加或自减的对象更有效 154
214、重载运算符的返回类型未被定义 155
215、理解函数调用运算符 156
216、使用带有非整数参数的下标运算符 157
第七章 继承和成员访问控制 159
217、在C+++中,Struct是公有类 160
218、在说明结构时,无需使用typedef 160
219、指定存取说明符时,不必保持成员次序 161
220、限制成员存取并不影响其可视性 161
221、当私有派生时,如何选择存取权限 162
222、当基本类被公有继承时,不可取消基本类中特定成员的存取权限 163
223、避免使成员数据公有 163
224、当一个类从C的结构继承时,使其私有派生 163
225、何时公有派生 164
226、何时私有派生 164
227、当编写Template类时,从私有基本类派生 165
228、在Template基本类中,使用保护成员 167
230、解决多重继承的二义性 168
229、谨慎使用多重继承 168
231、使用虚拟基本类 169
232、不要将所有类定义为虚拟类 171
233、解决多重继承中二义性的虚拟函数调用 171
234、如何避免过多的虚拟基本类函数调用 173
235、虚拟基本类必须被任何导出类初始化 175
236、用多重继承转换一个类可以改变指针值 177
237、当从无关联基本类导出时,多重继承是易实现的 178
238、用隐含类代替多重继承 178
239、为多重继承设计类 180
第八章 C+++技术 183
240、当两个类彼此引用时 184
241、在执行文件中包含被引用的类 185
242、将类分层(级)来屏蔽执行细节 186
243、为指针保留引用计数值 188
第九章 预处理 193
244、使用宏实现条件编译 194
245、用宏作为标志 195
246、用#if0语句来实现代码的注释 196
247、在宏和函数之间提供一个选择 196
248、#include“文件名”和#include〈文件名〉之间的差别 197
249、include语句中的文件名可以是一个宏 197
250、include中的文件可以嵌套 198
251、怎样避免多次嵌入头文件 198
252、头文件中不应该包含有变量数据 200
253、用#deeine语句说明一个常量 200
254、使用函数宏 200
255、使用括号定义函数宏 201
256、扩充一个宏成多行 202
257、使用字符化运算符 202
258、用字符化运算符来扩展宏 203
259、使用连接运算符 203
260、用连接运算符定义类型函数 204
261、使用预定义宏 205
262、使用#error指令 206
263、pragma指令的作用 206
264、使用#line指令 207
265、标识#endif指令 207
266、怎样写一个多语句的宏 208
267、怎样按照整型的长度有条件地编译 209
268、用预处理仿真C+++样板 210
第十章 程序设计风格问题 213
269、在一个数据项的名字中指出它的类型 214
270、使用较长的描述性名字 214
271、两个命名惯例 215
272、命名循环计数器 216
273、命名宏 216
274、类型定义(typedefs) 217
275、C+++类的命名 217
276、类对象的命名 218
277、函数的命名 218
278、命名作为数据包容使用的函数成员 219
279、使用花括弧的三种风格 221
281、划分if和while语句 223
280、表达式的写法 223
282、怎样划分for语句 225
283、长的函数调用怎样划分 225
284、把else if语句当作一个语句对待 226
285、尽量避免使for和while语句的语句体为空 226
286、将do语句中的while放到紧接do语句的右括号之后的同一行上 227
287、switch语句的格式 227
288、函数定义的写法 228
289、定义类的两种方法 229
290、编排内联函数 230
291、分隔内联函数 230
292、预处理语句不一定必须从第一列开始 231
293、让编译器来优化表达式 232
第十一章 标准C库函数 237
第二部分 库函数 237
294、使用支持库函数的头文件 238
295、使用C的库函数后应该检查错误信息 238
296、一个函数调用成功时,errno中也可能包含有一个代码 238
297、main之后的退出函数 238
298、memcpy函数不处理重叠区 239
299、用swab函数交换字节的顺序 240
300、在长整型上交换字节顺序 240
301、用getenv读取环境变量 241
302、使用字符分类函数 241
303、创建唯一的文件名 242
304、获取有关文件信息 243
307、选择流或低级文件I/O 244
305、用seek函数找出文件的长度 244
306、文件I/O字符例程使用整型 244
308、用“W”方式打开一个已存在的文件会使文件被重写 245
309、在修改方式进行读写 245
310、用freopen重定向标准流 245
311、重定向标准流回到原来状态 246
312、何时使用上锁函数 247
313、calloc函数初始化数据为0 247
314、calloc或memset不能用于初始化指针和浮点数 248
315、用Time作为随机数种子 248
316、用qsort函数排序数组 248
317、使用带qsort函数的样板 250
318、在qsort函数中使用指针数组 251
319、在排好序的数组中查找 252
320、使用assert函数 252
321、在维护失败时设置断点 253
322、用Strf time格式化时间 254
323、strftime与流结合起来格式化日期和时间 255
324、使用strrchr函数提取一个文件路径中的文件名 256
325、用strcat函数合并字串时,要给它分配存储空间 257
326、sprintf函数也可以连接字符串 258
327、使用longjmp和setjmp函数进行出错恢复 259
328、复制字符串 260
329、大小写转换函数不能用于所有的欧洲式字符上 261
330、应小心使用大写的欧洲文本 261
331、用strchr函数来标记“,”分隔符 262
332、用strtol和strtod函数分析列表中的字段 263
333、删除一个字符串中最后一个字符 265
334、scanf中的参数必须是地址 266
335、用scanf查找字符集 266
336、scanf抑制赋值运算符 267
337、恢复scanf中的错误 267
338、避免用scanf函数直接从键盘读入 268
339、用printf函数实现动态精度 268
340、用printf函数实现动态对齐 269
341、存取可变参数表 270
342、传递可变参数给其它的函数 271
343、传递可变参数给printf 272
第十二章 C+++I/O流库 275
344、尽量使用输入输出流,少用printf和scanf 276
345、理解流 276
346、读输入之前先刷新输出 277
347、使用流操作函数 278
348、为十六进制数设置大写字符 278
349、指定一个字段的宽度 279
350、居左、右、中间对齐 280
351、显示十六进制或八进制的基 281
352、使点(.)前导 281
353、调节十六进制数以适合字长 282
354、设置浮点数精度的格式 282
355、使用ios类公共成员函数 283
357、使用带内部缓冲的ostrstream 284
356、写入存储缓冲器 284
358、用ostrstream写图形用户接口 285
359、写自己的操纵算子 285
360、写一个带整型或长整型的操纵算子 286
361、写带非整型参数的操纵算子 287
362、定义一个复杂类型的操纵算子 288
363、写一个带多个参数的操纵算子 288
364、重载<<运算符去流一个类 290
365、提取值时处理分隔符 291
366、在分析时使用seekg和tellg函数 291
367、二进制文件上的流 294
368、流类对象 294
370、用get函数读取定界符 297
369、查看档案类 297
371、重定义cin和cout 298
第三部分 MS-DOS说明 301
第十三章 分段式体系结构 301
372、了解Intel的分段式体系结构 302
373、何时使用32位的编译器 302
374、选择16位的存储器模式 303
375、对Near,Far和Huge地址变换器使用宏 304
376、用经过优化的Smaller模式来建立应用程序 304
377、当使用Medium和Large模式时,说明局部函数为静态Near 304
378、定义一些数据项为Far,从而使得可以保留在一种存储器模式中 305
380、把V表移入代码段,以便程序保留在Medium模式中 306
381、匹配存储器模式和函数库 306
379、使用Huge指针 306
382、建立适合任何模式的库 307
383、连接标准库和混合模式应用程序 307
384、如果需要指定Far指针,则对引用也须如此 308
385、把同类函数组合在一个段内以优化存储管理 308
第十四章 目录 312
386、显示DOS目录中的文件 312
387、列目录时将日期和时间同时列出 312
388、找出目录中的特殊文件和子目录 314
389、将目录排序 315
390、chdir函数不改变DOS驱动器 316
391、搜索环境路径字符串 317
393、文件说明缓冲器最长为120个字符 318
392、目录名可以有后缀 318
394、如果你要保存文件路径指定,使用从堆里分配的内存 319
第十五章 调试 321
395、检查未赋值的返回值 322
396、检查复杂的函数参数 322
397、使用调试程序测试各个字程序 323
398、Windows函数的参数是自左向右入栈的 324
399、尽可能在一个保护模式的操作系统下开发应用程序 324
400、不学习Windows程序设计而在Windows下进行开发 324
401、中断Windows程序 325
402、中断后不要在系统程序中单步执行 325
403、在库函数出错时找到调用点 325
404、如果重复删除一个对象将会出现什么 326
405、不要攻击编译程序作者 326