-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathhigh-quality-cpp.html
More file actions
379 lines (320 loc) · 14.3 KB
/
high-quality-cpp.html
File metadata and controls
379 lines (320 loc) · 14.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
<!DOCTYPE html>
<html>
<head>
<!-- [[! Document Settings ]] -->
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<!-- [[! Page Meta ]] -->
<title>高质量C++编程注意事项</title>
<meta name="description" content="与机器,人,神共舞 - 编程,读书,思考,旅行,与机器对话,与人交谈,对神发问,探索,体验人生美丽的风景" />
<meta name="HandheldFriendly" content="True" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="shortcut icon" href="/assets/images/favicon.ico" >
<!-- [[! Styles'n'Scripts ]] -->
<link rel="stylesheet" type="text/css" href="/assets/css/screen.css" />
<link rel="stylesheet" type="text/css"
href="//fonts.googleapis.com/css?family=Merriweather:300,700,700italic,300italic|Open+Sans:700,400" />
<link rel="stylesheet" type="text/css" href="/assets/css/syntax.css" />
<!-- [[! Ghost outputs important style and meta data with this tag ]] -->
<link rel="canonical" href="/" />
<meta name="referrer" content="origin" />
<link rel="next" href="/page2/" />
<meta property="og:site_name" content="与机器,人,神共舞" />
<meta property="og:type" content="website" />
<meta property="og:title" content="与机器,人,神共舞" />
<meta property="og:description" content="编程,读书,思考,旅行,与机器对话,与人交谈,对神发问,探索,体验人生美丽的风景" />
<meta property="og:url" content="/" />
<meta property="og:image" content="/assets/images/cover1.jpg" />
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content="与机器,人,神共舞" />
<meta name="twitter:description" content="编程,读书,思考,旅行,与机器对话,与人交谈,对神发问,探索,体验人生美丽的风景" />
<meta name="twitter:url" content="/" />
<meta name="twitter:image:src" content="/assets/images/cover1.jpg" />
<script type="application/ld+json">
{
"@context": "http://schema.org",
"@type": "Website",
"publisher": "Tao's Page",
"url": "/",
"image": "/assets/images/cover1.jpg",
"description": "编程,读书,思考,旅行,与机器对话,与人交谈,对神发问,探索,体验人生美丽的风景"
}
</script>
<meta name="generator" content="Jekyll 3.0.0" />
<link rel="alternate" type="application/rss+xml" title="与机器,人,神共舞" href="/rss.xml" />
</head>
<body class="home-template nav-closed">
<div class="nav">
<h3 class="nav-title">Menu</h3>
<a href="#" class="nav-close">
<span class="hidden">Close</span>
</a>
<ul>
<li class="nav-home " role="presentation"><a href="/">Home</a></li>
<li class="nav-about " role="presentation"><a href="/about.html">About</a></li>
<li class="nav-fables " role="presentation"><a href="/tag/machine/">Machine</a></li>
<li class="nav-speeches " role="presentation"><a href="/tag/human/">Human</a></li>
<li class="nav-fiction " role="presentation"><a href="/tag/god/">God</a></li>
<li class="nav-author " role="presentation"><a href="/author/hetao/">Author</a></li>
</ul>
<a class="subscribe-button icon-feed" href="/vocab.html">Apps</a>
</div>
<span class="nav-cover"></span>
<div class="site-wrapper">
<!-- [[! Everything else gets inserted here ]] -->
<!-- default -->
<!-- The comment above "< default" means - insert everything in this file into -->
<!-- the [body] of the default.hbs template, which contains our header/footer. -->
<!-- Everything inside the #post tags pulls data from the post -->
<!-- #post -->
<header class="main-header post-head no-cover">
<nav class="main-nav clearfix">
</nav>
</header>
<main class="content" role="main">
<article class="post tag-machine">
<header class="post-header">
<h1 class="post-title">高质量C++编程注意事项</h1>
<section class="post-meta">
<!-- <a href='/'>Tao He</a> -->
<time class="post-date" datetime="2011-02-05">05 Feb 2011</time>
<!-- [[tags prefix=" on "]] -->
on
<a href='/tag/machine'>Machine</a>
</section>
</header>
<section class="post-content">
<ul>
<li>
<p>不提倡使用全局变量,尽量不要在头文件中出现象extern int value 这类声明</p>
</li>
<li>
<p>变量的名字应当使用“名词”或者“形容词+名词”</p>
</li>
<li>
<p>全局函数的名字应当使用“动词”或者“动词+名词”(动宾词组)</p>
</li>
<li>
<p>不可将布尔变量直接与TRUE、FALSE 或者1、0 进行比较</p>
</li>
<li>
<p>不可将浮点变量用“==”或“!=”与任何数字比较</p>
</li>
<li>
<p>在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的循环放在最外层,以减少CPU 跨切循环层的次数</p>
</li>
<li>
<p>如果循环体内存在逻辑判断,并且循环次数很大,宜将逻辑判断移到循环体的外面</p>
</li>
<li>
<p>在C++ 程序中只使用const 常量而不使用宏常量,即const 常量完全取代宏常量</p>
</li>
<li>
<p>需要对外公开的常量放在头文件中,不需要对外公开的常量放在定义文件的头部。为便于管理,可以把不同模块的常量集中存放在一个公共的头文件中</p>
</li>
<li>
<p>不要将正常值和错误标志混在一起返回。正常值用输出参数获得,而错误标志用return 语句返回</p>
</li>
<li>
<p>使用断言捕捉不应该发生的非法情况。不要混淆非法情况与错误情况之间的区别,后者是必然存在的并且是一定要作出处理的</p>
</li>
<li>
<p>用free 或delete 释放了内存之后,立即将指针设置为NULL,防止产生“野指针”</p>
</li>
<li>当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针</li>
<li>对于32 位以上的应用程序而言,无论怎样使用malloc 与new,几乎不可能导致“内存耗尽”</li>
<li>
<p>成员函数被重载的特征:</p>
<ul>
<li>
<p>相同的范围(在同一个类中);</p>
</li>
<li>
<p>函数名字相同</p>
</li>
<li>
<p>参数不同</p>
</li>
<li>
<p>virtual 关键字可有可无</p>
</li>
</ul>
</li>
<li>
<p>覆盖是指派生类函数覆盖基类函数,特征是:</p>
<ul>
<li>
<p>不同的范围(分别位于派生类与基类)</p>
</li>
<li>
<p>函数名字相同</p>
</li>
<li>
<p>参数相同</p>
</li>
<li>
<p>基类函数必须有virtual 关键字</p>
</li>
</ul>
</li>
<li>
<p>隐藏是指派生类的函数屏蔽了与其同名的基类函数,规则如下:</p>
<ul>
<li>
<p>如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual 关键字,基类的函数将被隐藏(注意别与重载混淆)</p>
</li>
<li>
<p>如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)</p>
</li>
</ul>
</li>
<li>
<p>在 C++运算符集合中,有一些运算符是不允许被重载的。这种限制是出于安全方面的考虑,可防止错误和混乱</p>
<ul>
<li>
<p>不能改变C++内部数据类型(如int,float 等)的运算符。</p>
</li>
<li>
<p>不能重载‘.’,因为‘.’在类中对任何成员都有意义,已经成为标准用法</p>
</li>
<li>
<p>不能重载目前C++运算符集合中没有的符号,如#,@,$等。原因有两点,一是难以理解,二是难以确定优先级</p>
</li>
<li>
<p>对已经存在的运算符进行重载时,不能改变优先级规则,否则将引起混乱</p>
</li>
</ul>
</li>
<li>
<p>“缺省的拷贝构造函数”和“缺省的赋值函数”均采用“位拷贝”而非“值拷贝”的方式来实现,倘若类中含有指针变量,这两个函数注定将出错</p>
</li>
<li>
<p>如果类存在继承关系,派生类必须在其初始化表里调用基类的构造函数</p>
</li>
<li>
<p>类的const 常量只能在初始化表里被初始化,因为它不能在函数体内用赋值的方式来初始化</p>
</li>
<li>
<p>成员对象初始化的次序完全不受它们在初始化表中次序的影响,只由成员对象在类中声明的次序决定</p>
</li>
<li>
<p>如果类A 和类B 毫不相关,不可以为了使B 的功能更多些而让B继承A 的功能和属性</p>
</li>
<li>
<p>若在逻辑上B 是A 的“一种”,并且A 的所有功能和属性对B 而言都有意义,则允许B 继承A 的功能和属性</p>
</li>
<li>
<p>若在逻辑上A 是B 的“一部分”(a part of),则不允许B 从A 派生,而是要用A 和其它东西组合出B</p>
</li>
<li>
<p>如果输入参数采用“指针传递”,那么加const 修饰可以防止意外地改动该指针,起到保护作用</p>
</li>
<li>
<p>如果输入参数采用“值传递”,由于函数将自动产生临时变量用于复制该参数,该输入参数本来就无需保护,所以不要加const 修饰</p>
</li>
<li>
<p>如果函数返回值采用“值传递方式”,由于函数会把返回值复制到外部临时的存储单元中,加const 修饰没有任何价值</p>
</li>
<li>
<p>不要一味地追求程序的效率,应当在满足正确性、可靠性、健壮性、可读性等质量因素的前提下,设法提高程序的效率</p>
</li>
<li>
<p>以提高程序的全局效率为主,提高局部效率为辅</p>
</li>
<li>
<p>在优化程序的效率时,应当先找出限制效率的“瓶颈”,不要在无关紧要之处优化。</p>
</li>
<li>
<p>先优化数据结构和算法,再优化执行代码</p>
</li>
<li>
<p>有时候时间效率和空间效率可能对立,此时应当分析那个更重要,作出适当的折衷。例如多花费一些内存来提高性能。</p>
</li>
<li>
<p>不要追求紧凑的代码,因为紧凑的代码并不能产生高效的机器码。</p>
</li>
<li>
<table>
<tbody>
<tr>
<td>当心那些视觉上不易分辨的操作符发生书写错误。我们经常会把“==”误写成“=”,象“</td>
<td> </td>
<td>”、“&&”、“<=”、“>=”这类符号也很容易发生“丢1”失误。然而编器却不一定能自动指出这类错误。</td>
</tr>
</tbody>
</table>
</li>
<li>
<p>变量(指针、数组)被创建之后应当及时把它们初始化,以防止把未被初始化的变量当成右值使用。</p>
</li>
<li>
<p>当心变量的初值、缺省值错误,或者精度不够。</p>
</li>
<li>
<p>当心数据类型转换发生错误。尽量使用显式的数据类型转换(让人们知道发生了什么事),避免让编译器轻悄悄地进行隐式的数据类型转换。</p>
</li>
<li>
<p>当心变量发生上溢或下溢,数组的下标越界。</p>
</li>
<li>
<p>当心忘记编写错误处理程序,当心错误处理程序本身有误。</p>
</li>
<li>
<p>当心文件I/O 有错误。</p>
</li>
<li>
<p>避免编写技巧性很高代码。</p>
</li>
<li>
<p>不要设计面面俱到、非常灵活的数据结构。</p>
</li>
<li>如果原有的代码质量比较好,尽量复用它。但是不要修补很差劲的代码,应当重新编写。</li>
</ul>
</section>
<footer class="post-footer">
<!-- Everything inside the #author tags pulls data from the author -->
<!-- #author-->
<!-- Add Disqus Comments -->
</footer>
</article>
</main>
<aside class="read-next">
<!-- [[! next_post ]] -->
<a class="read-next-story no-cover" href="/smart-pointer-in-cpp">
<section class="post">
<h2>Smart Pointer in C++</h2>
<p>In C++, there is a uncommnon conception named smart pointer, it is rarely seen in...</p>
</section>
</a>
<!-- [[! /next_post ]] -->
<!-- [[! prev_post ]] -->
<a class="read-next-story prev no-cover" href="/copy-and-swap-idiom-in-cpp">
<section class="post">
<h2>Copy and swap idiom in C++</h2>
<p>Purpose - assists the assignment operator in achieving two things: avoiding code duplication providing a...</p>
</section>
</a>
<!-- [[! /prev_post ]] -->
</aside>
<!-- /post -->
<footer class="site-footer clearfix">
<section class="copyright"><a href="/">与机器,人,神共舞</a> © 2024</section>
</footer>
</div>
<!-- [[! Ghost outputs important scripts and data with this tag ]] -->
<script type="text/javascript" src="https://code.jquery.com/jquery-1.11.3.min.js"></script>
<!-- [[! The main JavaScript file for Casper ]] -->
<script type="text/javascript" src="/assets/js/jquery.fitvids.js"></script>
<script type="text/javascript" src="/assets/js/index.js"></script>
<!-- Add Google Analytics -->
<!-- Google Analytics Tracking code -->
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-78960009-1', 'auto');
ga('send', 'pageview');
</script>
</body>
</html>