﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>IT博客-这不是最好的时代,&amp;nbsp;也不是最坏的时代。-文章分类-学习体会</title><link>http://www.cnitblog.com/benwhite/category/4790.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 26 Sep 2011 14:25:34 GMT</lastBuildDate><pubDate>Mon, 26 Sep 2011 14:25:34 GMT</pubDate><ttl>60</ttl><item><title>启示</title><link>http://www.cnitblog.com/benwhite/articles/59944.html</link><dc:creator>BenWhite</dc:creator><author>BenWhite</author><pubDate>Wed, 08 Jul 2009 13:58:00 GMT</pubDate><guid>http://www.cnitblog.com/benwhite/articles/59944.html</guid><wfw:comment>http://www.cnitblog.com/benwhite/comments/59944.html</wfw:comment><comments>http://www.cnitblog.com/benwhite/articles/59944.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/benwhite/comments/commentRss/59944.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/benwhite/services/trackbacks/59944.html</trackback:ping><description><![CDATA[
		<p>昨日拔牙后 夜里突然出血</p>
		<p>于是大半夜跑到市一医院 浙一医院 去处理</p>
		<p>那时候在路上 心里有些恐慌 失血过度不是好事情</p>
		<p>嘴里咸咸的血味 已经咽了不少血了</p>
		<p>突然感觉很无助 难道这就是传说中的血崩吗</p>
		<p>难道我年轻的生命就此要面临一大劫难了吗</p>
		<p>医生说以前根本没见过这个大出血的 就像济南趵突泉</p>
		<p>不断冒出来 我开始绝望了</p>
		<p>夜里的城市里 弥漫了孤独和寂寥</p>
		<p>我行走在街道上 抬头看见 白晃晃的月亮</p>
		<p>浮云像是一道道刀疤 布满整个天空</p>
		<p>偶尔飞驰而过的汽车 扬起一阵漠然</p>
		<p>已经一天没吃什么东西了 头晕范恶 心跳很快</p>
		<p>难道我将这样离开了吗</p>
		<p>离开吧 离开可能就不会那么痛苦</p>
		<p>白日里的事情变得毫无意义 红尘里的纷繁</p>
		<p>都是空空 心里依然疲惫</p>
		<p>但是还有很多朋友 还有很多快乐</p>
		<p>倘若离开 实在有些可惜</p>
		<p>上天要召我回去 那也就回去</p>
		<p>这是无法拒绝的</p>
		<p>我扪心苦笑着 走进医院</p>
		<p>市一的医生说 我没有办法</p>
		<p>你直接去浙一吧 我只能帮你加点棉花</p>
		<p>于是我更加绝望 拖着疲惫的影子</p>
		<p>来到急诊的浙一</p>
		<p>夜晚的医院依然忙碌</p>
		<p>我看着大厅了躺着的病人 焦虑的家属</p>
		<p>忙碌的护士 突然觉得生命的不易</p>
		<p>这里睡着的 睁眼的 愁眉的 紧张的</p>
		<p>张张面孔 在黑夜里 依然明亮</p>
		<p>护士叫来了值班的牙科医生</p>
		<p>很年轻的医生 似乎还在读书</p>
		<p>我深表歉意的表明身份</p>
		<p>只是嘴里的棉花堵着嘴巴</p>
		<p>无法清晰表达</p>
		<p>医生 也皱起了眉头</p>
		<p>这种情况很少见</p>
		<p>幸亏我是年轻人</p>
		<p>倘若是老年人就有生命危险</p>
		<p>那怎么处理呢</p>
		<p>医生思索着帮我擦洗嘴巴</p>
		<p>不断换出棉花</p>
		<p>我躺在台上 看着明晃晃的灯光</p>
		<p>突然觉得很累 似乎一切都已不重要</p>
		<p>灯光想小时候的夕阳</p>
		<p>照耀着回家的路 温暖而静谧</p>
		<p>医生问 以前出现过这种状况吗</p>
		<p>我摇摇头 上一颗牙齿安然拔掉</p>
		<p>不想这次会这样</p>
		<p>医生说 明天我说给我同事听 他们都不一定相信</p>
		<p>这么大的出血量</p>
		<p>医生最终将纱布填进了伤口</p>
		<p>不断止血</p>
		<p>突然说 现在出血已经不那么严重了</p>
		<p>我心里释然的跳了一下</p>
		<p>然后医生将一段纱布留在伤口内</p>
		<p>并缝了几针</p>
		<p>血终于是止住了</p>
		<p>嘴里的咸味变少了</p>
		<p>谢天谢地 看来不是伤到血管</p>
		<p>看来上天还没要将我召回</p>
		<p>我咬着棉花</p>
		<p>突然觉得很快乐</p>
		<p>这种快乐不是一般的开心</p>
		<p>而是面对过一种恐惧 思考过死亡</p>
		<p>才焕发的快乐</p>
		<p>生命在我眼里突然鲜活起来了</p>
		<p>世界的颜色似乎变得鲜艳</p>
		<p>红的 绿的 黄的 蓝的</p>
		<p>怎么以前没有发觉呢</p>
		<p>我抬头看月亮</p>
		<p>白晃晃的像一面镜子</p>
		<p>里面倒映出我的模样</p>
		<p>逃过一劫</p>
		<p>就像戏剧</p>
		<p>我想起弟弟曾经掉进水塘里</p>
		<p>回来告诉我 挣扎时那种漫天满地的绝望和黑暗</p>
		<p>几乎就要被死亡拥抱</p>
		<p>我现在能够体会</p>
		<p>只有经过对死亡直接恐惧</p>
		<p>人才能真正看待 生</p>
		<p>只有跳出了原来的麻木</p>
		<p>才能真正理解生命</p>
		<p>生活是可贵的</p>
		<p>这恐怕是上天通过这次</p>
		<p>想给我的启示</p>
		<p>感谢 感谢 感谢一切</p>
<img src ="http://www.cnitblog.com/benwhite/aggbug/59944.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/benwhite/" target="_blank">BenWhite</a> 2009-07-08 21:58 <a href="http://www.cnitblog.com/benwhite/articles/59944.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C/C++语言void及void指针深层探索 zz</title><link>http://www.cnitblog.com/benwhite/articles/25779.html</link><dc:creator>BenWhite</dc:creator><author>BenWhite</author><pubDate>Mon, 16 Apr 2007 08:37:00 GMT</pubDate><guid>http://www.cnitblog.com/benwhite/articles/25779.html</guid><wfw:comment>http://www.cnitblog.com/benwhite/comments/25779.html</wfw:comment><comments>http://www.cnitblog.com/benwhite/articles/25779.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/benwhite/comments/commentRss/25779.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/benwhite/services/trackbacks/25779.html</trackback:ping><description><![CDATA[
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td valign="center" height="50">
										<span class="style39">
												<font color="#ff0000">C/C++语言void及void指针深层探索</font>
										</span>
								</td>
						</tr>
						<tr>
								<td class="style36 style42" valign="center" height="26">
										<font color="#ff0000">
										</font>
								</td>
						</tr>
						<tr>
								<td class="style37 line_b3" valign="top" height="20">佚名　blog | 2006-08-08 08:59:01 | </td>
						</tr>
						<tr>
								<td class="text" align="left">
										<p>引:许多初学者对C/C++语言中的void及void指针类型不甚理解，因此在使用上出现了一些错误。本文将对void关键字的深刻含义进行解说，并详述void及void指针类型的使用方法与技巧。</p>　　<b>1.概述</b><br /><br />　　许多初学者对C/C++语言中的void及void指针类型不甚理解，因此在使用上出现了一些错误。本文将对void关键字的深刻含义进行解说，并详述void及void指针类型的使用方法与技巧。<br /><br />　　<b>2.void的含义</b><br /><br />　　void的字面意思是“无类型”，void *则为“无类型指针”，void *可以指向任何类型的数据。<br /><br />　　void几乎只有“注释”和限制程序的作用，因为从来没有人会定义一个void变量，让我们试着来定义： <br /><br /><table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e7e9e9" border="1"><tbody><tr><td>void a;</td></tr></tbody></table><br />　　这行语句编译时会出错，提示“illegal use of type 'void'”。不过，即使void a的编译不会出错，它也没有任何实际意义。<br /><br />　　void真正发挥的作用在于：<br /><br />　　（1）对函数返回的限定；<br /><br />　　（2）对函数参数的限定。<br /><br />　　我们将在第三节对以上二点进行具体说明。<br /><br />　　众所周知，如果指针p1和p2的类型相同，那么我们可以直接在p1和p2间互相赋值；如果p1和p2指向不同的数据类型，则必须使用强制类型转换运算符把赋值运算符右边的指针类型转换为左边指针的类型。 <br /><br />　　例如：<br /><br /><table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e7e9e9" border="1"><tbody><tr><td>float *p1;<br />int *p2;<br />p1 = p2;</td></tr></tbody></table><br />　　其中p1 = p2语句会编译出错，提示“'=' : cannot convert from 'int *' to 'float *'”，必须改为：<br /><br /><table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e7e9e9" border="1"><tbody><tr><td>p1 = (float *)p2;</td></tr></tbody></table><br />　　而void *则不同，任何类型的指针都可以直接赋值给它，无需进行强制类型转换： <br /><br /><table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e7e9e9" border="1"><tbody><tr><td>void *p1;<br />int *p2;<br />p1 = p2;</td></tr></tbody></table><br />　　但这并不意味着，void *也可以无需强制类型转换地赋给其它类型的指针。因为“无类型”可以包容“有类型”，而“有类型”则不能包容“无类型”。道理很简单，我们可以说“男人和女人都是人”，但不能说“人是男人”或者“人是女人”。下面的语句编译出错：<br /><br /><table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e7e9e9" border="1"><tbody><tr><td>void *p1;<br />int *p2;<br />p2 = p1;</td></tr></tbody></table><p><br />　　提示“'=' : cannot convert from 'void *' to 'int *'”。<span id="contentAdv"><br /></span></p><p>　　<b>3.void的使用</b><br /><br />　　下面给出void关键字的使用规则：<br /><br />　　<b>规则一如果函数没有返回值，那么应声明为void类型</b><br /><br />　　在C语言中，凡不加返回值类型限定的函数，就会被编译器作为返回整型值处理。但是许多程序员却误以为其为void类型。例如：<br /><br /></p><table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e7e9e9" border="1"><tbody><tr><td>add ( int a, int b )<br />{<br />return a + b;<br />}<br />int main(int argc, char* argv[])<br />{<br />printf ( "2 + 3 = %d", add ( 2, 3) );<br />}</td></tr></tbody></table><br />　　程序运行的结果为输出：<br /><br />　　2 + 3 = 5<br /><br />　　这说明不加返回值说明的函数的确为int函数。<br /><br />　　林锐博士《高质量C/C++编程》中提到：“C++语言有很严格的类型安全检查，不允许上述情况（指函数不加类型声明）发生”。可是编译器并不一定这么认定，譬如在Visual C++6.0中上述add函数的编译无错也无警告且运行正确，所以不能寄希望于编译器会做严格的类型检查。<br /><br />　　因此，为了避免混乱，我们在编写C/C++程序时，对于任何函数都必须一个不漏地指定其类型。如果函数没有返回值，一定要声明为void类型。这既是程序良好可读性的需要，也是编程规范性的要求。另外，加上void类型声明后，也可以发挥代码的“自注释”作用。代码的“自注释”即代码能自己注释自己。<br /><br />　　<b>规则二如果函数无参数，那么应声明其参数为void</b><br /><br />　　在C++语言中声明一个这样的函数：<br /><br /><table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e7e9e9" border="1"><tbody><tr><td>int function(void)<br />{<br />return 1;<br />}</td></tr></tbody></table><br />　　则进行下面的调用是不合法的：<br /><br /><table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e7e9e9" border="1"><tbody><tr><td>function(2);</td></tr></tbody></table><br />　　因为在C++中，函数参数为void的意思是这个函数不接受任何参数。<br /><br />　　我们在Turbo C 2.0中编译：<br /><br /><table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e7e9e9" border="1"><tbody><tr><td>#include "stdio.h"<br />fun()<br />{<br />return 1;<br />}<br />main()<br />{<br />printf("%d",fun(2));<br />getchar();<br />}</td></tr></tbody></table><br />　　编译正确且输出1，这说明，在C语言中，可以给无参数的函数传送任意类型的参数，但是在C++编译器中编译同样的代码则会出错。在C++中，不能向无参数的函数传送任何参数，出错提示“'fun' : function does not take 1 parameters”。<br /><br />　　所以，无论在C还是C++中，若函数不接受任何参数，一定要指明参数为void。<br /><br />　　<b>规则三小心使用void指针类型</b><br /><br />　　按照ANSI(American National Standards Institute)标准，不能对void指针进行算法操作，即下列操作都是不合法的：<br /><br /><table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e7e9e9" border="1"><tbody><tr><td>void * pvoid;<br />pvoid++; //ANSI：错误<br />pvoid += 1; //ANSI：错误<br />//ANSI标准之所以这样认定，是因为它坚持：进行算法操作的指针必须是确定知道其指向数据类型大小的。<br />//例如：<br />int *pint;<br />pint++; //ANSI：正确</td></tr></tbody></table><br />　　pint++的结果是使其增大sizeof(int)。<br /><br />　　但是大名鼎鼎的GNU(GNU's Not Unix的缩写)则不这么认定，它指定void *的算法操作与char *一致。<br /><br />　　因此下列语句在GNU编译器中皆正确：<br /><br /><table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e7e9e9" border="1"><tbody><tr><td>pvoid++; //GNU：正确<br />pvoid += 1; //GNU：正确</td></tr></tbody></table><br />　　pvoid++的执行结果是其增大了1。<br /><br />　　在实际的程序设计中，为迎合ANSI标准，并提高程序的可移植性，我们可以这样编写实现同样功能的代码：<br /><br /><table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e7e9e9" border="1"><tbody><tr><td>void * pvoid;<br />(char *)pvoid++; //ANSI：正确；GNU：正确<br />(char *)pvoid += 1; //ANSI：错误；GNU：正确</td></tr></tbody></table><br />　　GNU和ANSI还有一些区别，总体而言，GNU较ANSI更“开放”，提供了对更多语法的支持。但是我们在真实设计时，还是应该尽可能地迎合ANSI标准。<br /><br />　　<b>规则四如果函数的参数可以是任意类型指针，那么应声明其参数为void *</b><br /><br />　　典型的如内存操作函数memcpy和memset的函数原型分别为：<br /><br /><table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e7e9e9" border="1"><tbody><tr><td>void * memcpy(void *dest, const void *src, size_t len);<br />void * memset ( void * buffer, int c, size_t num );</td></tr></tbody></table><br />　　这样，任何类型的指针都可以传入memcpy和memset中，这也真实地体现了内存操作函数的意义，因为它操作的对象仅仅是一片内存，而不论这片内存是什么类型。如果memcpy和memset的参数类型不是void *，而是char *，那才叫真的奇怪了！这样的memcpy和memset明显不是一个“纯粹的，脱离低级趣味的”函数！<br /><br />　　下面的代码执行正确：<br /><br /><table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e7e9e9" border="1"><tbody><tr><td>//示例：memset接受任意类型指针<br />int intarray[100];<br />memset ( intarray, 0, 100*sizeof(int) ); //将intarray清0 <br />//示例：memcpy接受任意类型指针<br />int intarray1[100], intarray2[100];<br />memcpy ( intarray1, intarray2, 100*sizeof(int) ); //将intarray2拷贝给intarray1</td></tr></tbody></table><br />　　有趣的是，memcpy和memset函数返回的也是void *类型，标准库函数的编写者是多么地富有学问啊！<br /><br />　　<b>规则五 void不能代表一个真实的变量</b><br /><br />　　下面代码都企图让void代表一个真实的变量，因此都是错误的代码：<br /><br /><table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e7e9e9" border="1"><tbody><tr><td>void a; //错误<br />function(void a); //错误</td></tr></tbody></table><br />　　void体现了一种抽象，这个世界上的变量都是“有类型”的，譬如一个人不是男人就是女人（还有人妖？）。<br /><br />　　void的出现只是为了一种抽象的需要，如果你正确地理解了面向对象中“抽象基类”的概念，也很容易理解void数据类型。正如不能给抽象基类定义一个实例，我们也不能定义一个void（让我们类比的称void为“抽象数据类型”）变量。<br /><br />　　<b>4.总结</b><br /><br />　　小小的void蕴藏着很丰富的设计哲学，作为一名程序设计人员，对问题进行深一个层次的思考必然使我们受益匪浅</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.cnitblog.com/benwhite/aggbug/25779.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/benwhite/" target="_blank">BenWhite</a> 2007-04-16 16:37 <a href="http://www.cnitblog.com/benwhite/articles/25779.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++程序设计之四书五经（上篇）</title><link>http://www.cnitblog.com/benwhite/articles/25201.html</link><dc:creator>BenWhite</dc:creator><author>BenWhite</author><pubDate>Wed, 04 Apr 2007 12:28:00 GMT</pubDate><guid>http://www.cnitblog.com/benwhite/articles/25201.html</guid><wfw:comment>http://www.cnitblog.com/benwhite/comments/25201.html</wfw:comment><comments>http://www.cnitblog.com/benwhite/articles/25201.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/benwhite/comments/commentRss/25201.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/benwhite/services/trackbacks/25201.html</trackback:ping><description><![CDATA[<p style="TEXT-ALIGN: center" align=center>(<a href="http://www.royaloo.com/articles/articles_2004/cppbooks1.htm" rel=nofollow><u><font color=#0000ff>http://www.royaloo.com/articles/articles_2004/cppbooks1.htm</font></u></a>)　</p>
<p><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">C++</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">是一门广泛用于工业软件研发的大型语言。它自身的复杂性和解决现实问题的能力，使其极具学术研究价值和工业价值。和<span>C</span>语言一样，<span>C++</span>已经在许多重要的领域大获成功。</span></p>
<p>&#160;</p>
<p><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">然而，一个不可否认的现实是，在低阶程序设计领域，<span>C++</span>挤压着<span>C</span>同时也在承受着<span>C</span>的强烈反弹，而在高阶程序设计领域，<span>Java</span>和<span>C#</span>正在不断蚕食着<span>C++</span>的地盘。也许<span>C++</span>与<span>C</span>合为一体永远都是一个梦想，也许<span>Java</span>和<span>C#</span>的狂潮终将迫使<span>C++</span>回归本位 — 回到它有着根本性优势的开发领域：低级系统程序设计、高级大规模高性能应用设计、嵌入式程序设计以及数值科学计算等。果真如此，我认为这未尝不是一件好事。</span></p>
<p>&#160;</p>
<p><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">C++</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">吸引如此之多的智力投入，以至于这个领域的优秀作品，包括重量级的软件产品、程序库以及书籍等，数不胜数。文题"<span>C++</span>程序设计之四书五经"一个不太严格的含义是：<span>C++</span>程序设计之四书 ⅹ 五经。是的，在本文（及其下篇）中，我将分门别类推荐<span>20</span>多本<span>C++</span>好书，你可以根据自己的需要选读。</span></p>
<p>&#160;</p>
<p><strong><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">TCPL</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">和<span>D&amp;E</span></span></strong></p>
<p>&#160;</p>
<p><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">TCPL</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">和<span>D&amp;E</span>分别是<span style="COLOR: navy">《<span>The C++ Programming Language</span>》</span>和<span style="COLOR: navy">《</span></span><span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">The Design and Evolution of C++</span><span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">》</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">的简称，均出自<span>Bjarne Stroustrup</span>之手<span style="COLOR: navy">。</span></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">我将它们</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">单列出来，首先</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">是因为</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">Bjarne</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">是<span>C++</span>语言的创建者，然后是因为比"首先"那个原因更重要的原因：这两本书是<span>C++</span>领域毋庸置疑的杰作。说它们是<span>C++</span>语言圣经，并不为过。</span></p>
<p>&#160;</p>
<p><span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">Bjarne Stroustrup, The C++ Programming Language (Special 3rd Edition)</span></p>
<p><span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">《<span>C++</span>程序设计语言（特别版）》，机械工业出版社</span></p>
<p><span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">《<span>C++</span>程序设计语言（特别版）（英文影印版）》，高等教育出版社</span></p>
<p>&#160;</p>
<p><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">迄今为止，</span><span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">TCPL</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">是除了<span>C++</span>标准文献之外最权威的<span>C++</span>参考手册。和大多数人的看法不大一样，我认为<span>Bjarne</span>的文字语言并不逊色于他所创建的程序语言，至少我喜欢这种学院气息浓厚的作品。本书对<span>C++</span>语言的描述轮廓鲜明、直截了当。它从<span>C++</span>语言创建者的角度来观察<span>C++</span>，这是任何别的作者和书籍做不到的 — 没有任何人比<span>Bjarne</span>自己更清楚该怎么来使用<span>C++</span>。</span></p>
<p>&#160;</p>
<p><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">这是一本严肃的著作，以中、高级<span>C++</span>开发人员为目标读者。如果你是一名有经验的<span>C++</span>程序员，需要了解更加本质的<span>C++</span>知识，本书正是为你而写。它不是那种让你看了会不断窃喜的小书，需要用心体会，反复咀嚼。在阅读过程中，请特别留心<span>Bjarne</span>先生强调了什么，又对什么一语带过。我个人比较喜欢这本书的第四部分"使用<span>C++</span>做设计"，这样的内容在类似的程序设计语言书籍中很难看到 — 我甚至认为<span>Bjarne</span>应该将这部分独立出来单独写一本书。</span></p>
<p>　</p>
<p><span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">Bjarne Stroustrup, </span><span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">The Design and Evolution of C++</span></p>
<p><span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">《<span>C++</span>语言的设计和演化》，机械工业出版社</span></p>
<p><span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">《<span>C++</span>语言的设计和演化（英文版）》，机械工业出版社</span></p>
<p>&#160;</p>
<p><span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">D&amp;E</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">是一本关于<span>C++</span>语言设计</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">原理、设计决策和设计<span style="FONT-FAMILY: 宋体">哲学的专著。</span>它清晰地<span style="FONT-FAMILY: 宋体">回答了<span>C++</span>为什么会成为今天这个样子而没有变成另外一种语言。</span>作为<span>C++</span>语言的创建者，<span style="FONT-FAMILY: 宋体">Bjarne</span><span style="FONT-FAMILY: 宋体">淋漓尽致地展示了他独到而深刻的见解。除了广受赞誉的语言特性外，<span>Bjarne</span>没有回避那些引起争议的甚至被拒绝的<span>C++</span>特性，他一一给出了逻辑严密、令人信服的解释。内容涵盖<span>C++</span>的史前时代、带类的<span>C</span>、<span>C++</span>的设计规则、标准化、库、内存管理、多重继承、模板等，对包括异常机制、运行时类型信息和名字空间在内的重要的新特性都分别进行了深入探讨。每一名<span>C++</span>程序员都应该可以从<span>Bjarne</span>的阐释中加深对手中这门语言的认识。</span></span></p>
<p>&#160;</p>
<p><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">需要再次提醒的是，这两本书知识浓缩，信息量极大，请不要错过<span>Bjarne</span>每一句看似漫不经意的话。</span></p>
<p>&#160;</p>
<p><strong><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">入门教程</span></strong></p>
<p><strong></strong></p>
<p><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">学习任何一门语言都需要一个从入门到精通、从新手到高手循序渐进的过程。不过，对于一个所谓的新手而言，究竟是一个完完全全的新手，还是一个熟悉某种别的语言的"新手"，甚至是在某种语言程序设计领域已经颇有建树的高手，很难一概而论？不同的<span>C++</span>新手需要不同的入门书籍。</span></p>
<p><strong></strong></p>
<p><span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">Andrew Koenig, Barbara E. Moo, Accelerated C++: Practical Programming by Example</span></p>
<p><span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">《<span>Accelerated C++</span>中文版》，中国电力出版社</span></p>
<p>&#160;</p>
<p><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">和市面上大多数<span>C++</span>教程不同，本书不是从"<span>C++</span>中的<span>C</span>"开始讲解，而是始于地道的<span>C++</span>特性。从一开始就使用标准库来写程序，随着讲述的逐渐深入，又一一解释这些标准库组件所依赖的基础概念。另外，和其他<span>C++</span>教材不同的是，这本书以实例拉动语言和标准库的讲解，对后两者的讲解是为了给实例程序提供支持，而不是像绝大多数<span>C++</span>教材那样，例子只是用作演示语言特性和标准库用法的辅助工具。</span></p>
<p>&#160;</p>
<p><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">作者在<span>C++</span>领域的编程实践、教育培训以及技术写作方面都是世界一流水准。<span style="FONT-FAMILY: 宋体">我喜欢这种大量使用标准库和<span>C++</span>语言原生特性的清新的写作风格。在这本教材面前，几乎迄今为止的所有<span>C++</span>教材都黯然失色或显得过时。尽管这本教材也许对于国内的高校教育来说有些前卫，不过我仍然极力向我的同行们推荐。顺带一提，在</span></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">Bjarne</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">和我</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">最近的一封通信里，他这样评价本书：</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">对于有经验的程序员学习<span>C++</span>而言，这本书可能是世界上最好的一本。</span></p>
<p>&#160;</p>
<p><span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">Stanley B.Lippman, Josee Lajoie, </span><span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">C++ Primer (3rd Edition)</span></p>
<p><span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">《<span>C++ Primer (3RD)</span>中文版》，中国电力出版社</span></p>
<p>&#160;</p>
<p><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">这本书的名字多少有点让人误解。尽管作者声称这本书是为<span>C++</span>新手而写，但无论是它的厚度还是讲解的深度都暴露了似乎并非如此。也许说它是一本"从入门到精通"的<span>C++</span>教程会更合适一些。我个人认为它并不适合完全不懂<span>C++</span>的初学者 — 在阅读这本书之前，你至少应该先有那么一点<span>C</span>或<span>C++</span>的背景知识，或者至少要具有一些其他语言的编程经验。</span></p>
<p>&#160;</p>
<p><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">尽管这本书省略了一些高级<span>C++</span>特性的讨论，但仍然可以称得上是迄今为止最全面的<span>C++</span>学习教程。事实上，如果一名<span>C++</span>初学者能够扎扎实实地读完本书并对照<span style="COLOR: navy">《<span>C++ Primer Answer Book</span>》</span>完成全部习题的话，他的水平肯定可以进入职业<span>C++</span>程序员的行列。我个人认为，即使你已经拥有了<span style="COLOR: navy">TCPL</span>，这本书依然有拥有的价值，因为在许多方面它比<span style="COLOR: navy">TCPL</span>来得更详细、更易懂。</span></p>
<p>&#160;</p>
<p><span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">Stanley B. Lippman, Essential C++</span></p>
<p><span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">《<span>Essential C++</span>中文版》，华中科技大学出版社</span></p>
<p><span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">《<span>Essential C++</span>（影印版）》，中国电力出版社</span></p>
<p>&#160;</p>
<p><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">可以不太严格地认为这本书是《<span style="COLOR: navy">C++ Primer</span><span style="COLOR: navy">》</span>的精简版<span style="COLOR: navy">。</span>本书一一讲述了<span>C++</span>中最具代表性的主题，包括过程式编程、泛型编程、基于对象编程、面向对象编程、模板编程以及异常处理等。<span>Stanley</span>将门槛调低到"具有其他语言程序设计经验"的<span>C++</span>新手所能接受的最基本的层次，使他们能够迅速开始使用<span>C++</span>编程而又免于阅读<span style="COLOR: navy">《<span>C++ Primer</span>》</span>那样的大部头。它以实例引导学习，力图使读者在最短的时间内把握<span>C++</span>的精粹。</span></p>
<p>&#160;</p>
<p><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">也许换一个人来概述<span>C++</span>编程范型（</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">paradigm</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">）的方方面面需要好几百页才能说清楚，但这本小书不可思议地做到了这一点。我个人非常喜欢这种满是技术、简明扼要并且"有话好好说"的书。这本书同样具有一个明显的风格：所有程序例子全部采用标准库组件，让人耳目一新。</span></p>
<p>&#160;</p>
<p><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">以上三本书都不是为了完完全全的编程新手而写。完全的<span>C++</span>编程新手可以阅读<span>Francis Glassborow</span>的新书（尚未出版）：<span style="COLOR: navy">《</span><span style="COLOR: navy">You Can Do It!: </span><span style="COLOR: navy"><span>A Beginner's Introduction to Computer Programming</span>》</span>。这也是</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">Bjarne</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">的推荐。</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">Francis Glassborow</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">是<span>ACCU</span>主席，多年来他对几乎每一本<span>C++</span>经典名著评头论足，他自己的这一本自然会引起<span>C++</span>社群的极大兴趣。</span></p>
<p>&#160;</p>
<p><strong><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">高效、健壮编程</span></strong></p>
<p>&#160;</p>
<p><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">两年前我在负责一个省级电力调度系统项目时编写了一个网关程序，它从<span>SCADA</span>系统获取电力实时信息。通讯接口采用了不常用的数据库直连方式（这个网关程序一端连接<span>SQL Server 6.5</span>，另一端连接<span>Oralce 8.1.6</span>）。由于实时测点近万，每次将全部取样更新或插入一遍显然是低效的。我在网关程序里建了一个内存库，获取到的数据首先在其中进行比较，然后决定是否更新物理数据库（同时还做了别的更复杂的事情......），从而在效率和资源占用两方面达到了预期效果。</span></p>
<p>&#160;</p>
<p><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">这个程序一直运行得很好，但在离开现场之后的某一天，系统管理员打来电话，说大概因为网络故障等原因，有时这个网关程序会崩溃掉 — 它自己崩掉也就罢了，问题是它还会把<span>Windows 2000 Advanced Server</span>搞成"蓝屏"！坦白地说，我还从来没看过哪个非蓄意的程序有这个"能耐"。由于当时正忙于另外一个大项目，无法去现场调试，最后只有凭经验对内存库代码小心翼翼地封装以异常处理代码（同时也做了一些别的修改......）。这样，虽然没有彻底解决问题，但程序终究不再死得那么难看了。</span></p>
<p>&#160;</p>
<p><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">在这儿讲这么一段花絮有什么意思呢（当初为那个可怕的<span>bug</span>朝思暮想时我可不认为这是一个"花絮"）？我想说的是，对于任何软件而言，离开强健，效率也就无从谈起。而对于<span>C++</span>程序员来说，也许编写一个高效的程序并不难，但要编写一个需要<span>7 </span>ⅹ<span> 24</span>小时持续运行的服务端软件就不是那么容易了，需要考虑许多因素，有时这些因素甚至远远超出<span>C++</span>语言和开发工具的本身。作为一名开发实际项目软件的程序员，并非非得自己碰钉子才能积累经验，只要我们足够虚心，别人的经验往往都是我们很好的借鉴。鉴于此，我推荐以下几本书供你选读，它们可以让你从强健和效率两方面受益（当然了，它们涵盖的内容远不限于异常处理</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: wingdings">J</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">）。</span></p>
<p>&#160;</p>
<p><span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">Scott Meyers, Effective C++: 50 Specific Ways to Improve Your Programs and Design (2nd Edition)</span></p>
<p><span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">Scott Meyers, More Effective C++: 35 New Ways to Improve Your Programs and Designs</span></p>
<p><span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">《<span>Effective C++</span>中文版》，华中科技大学出版社</span></p>
<p><span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">《<span>More Effective C++</span>中文版》，中国电力出版社</span></p>
<p><span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">《<span>Effective C++</span>（影印版）》，中国电力出版社</span></p>
<p>&#160;</p>
<p><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">如果说<span style="COLOR: navy">《<span>Effective C++</span>》</span>主要讨论<span>C++</span>中一些相对基础的概念和技巧的话，那么<span style="COLOR: navy">《<span>More Effective C++</span>》</span>则着重探讨了包括异常处理在内的一系列高级技术。与前者相比，后者具有两大主要区别：其一，它包含很多时新的标准<span>C++</span>的内容；第二，它讨论的主题倾向于"战略化"而非"战术化"，并且讨论得更深入、更彻底。尤其是对虚析构函数、智能指针、引用计数以及代理类（<span>proxy classe</span>）等技术和模式论述的深入程度，让人很难想象是出现于这样的一本小书之中。</span></p>
<p>&#160;</p>
<p><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">游刃有余的技术，高超的写作技巧，<span>Scott</span>无疑是世界上最优秀的<span>C++</span>技术作家之一。在简洁、清晰、易读等方面，这两本书都卓尔不群。总之，<span>Scott</span>提供的这<span>85</span>个可以改善编程技术和设计思维的方法，都是中、高级<span>C++</span>程序员必备的技能。我强烈推荐这两本书（实际上还有一本，稍后就会看到）。</span></p>
<p>&#160;</p>
<p><span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">Herb Sutter, Exceptional C++: 47 Engineering Puzzles, Programming Problems, and Solutions</span></p>
<p><span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">Herb Sutter, More Exceptional C++: 40 New Engineering Puzzles, Programming Problems, and Solutions</span></p>
<p><span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">《<span>Exceptional C++</span>中文版》，中国电力出版社</span></p>
<p><span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">《<span>More Exceptional C++</span>中文版》，华中科技大学出版社</span></p>
<p>&#160;</p>
<p><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">你自认为是一名<span>C++</span>语言专家吗？读一读<span>ISO C++</span>标准委员会秘书长的这两本书再回答。在这两本书中，</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">Herb</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">采用了"问答"的方式指导你学习<span>C++</span>语言特性。对于每一个专题，<span>Herb</span>首先合理地设想出你的疑问和困惑，接着又猜测出你十有八九是错误的解答，然后给你以指点并提出最佳解决方案，最后还归纳出解决类似问题的普适性原则。</span></p>
<p>&#160;</p>
<p><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">这两本书是典型的深究<span>C++</span>语言细节的著作，很薄，但内容密集，远远超过<span>Scott</span>的那两本书，读起来很费脑筋 — 我个人认为它们要比<span>Scott</span>的书难懂得多。若要研习这薄薄的两本书所包含的知识，至少需要花费数月的时间！（在<span>Scott</span>的荐序中，他坦陈不止一次陷入<span>GotW</span>问题的陷阱，你应该知道这意味着什么）对于语言细节的深究有什么好处呢？尽管在大多数情况下，我们不必关心<span>C++</span>代码幕后的动作，然而当我们不得不关心时，这两本书可以为我们提供很好的线索，因为它们揭示了<span>C++</span>语言中微妙而又至关重要的东西。</span></p>
<p>&#160;</p>
<p><span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">Stephen C. Dewhurst, C++ Gotchas: Avoiding Common Problems in Coding and Design</span></p>
<p><span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">《<span>C++</span>程序设计陷阱》，中国青年出版社</span></p>
<p>&#160;</p>
<p><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">Stephen</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">的理论素养和实践经验注定这是一本值得一读的好书。<span>Stephen</span>曾经是贝尔实验室中第一批<span>C++</span>使用者。他已经使用<span>C++</span>成功解决了包括编译器、证券交易、电子商务以及嵌入式系统等领域中的问题。本书汇集了作者来自开发一线的<span>99</span>条编程真知灼见，洞悉它们，你可以避免几乎所有常见的<span>C++</span>设计和编程问题。</span></p>
<p>&#160;</p>
<p><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">我甚至认为，对于<span>C++</span>编程菜鸟而言，阅读这本书会比阅读<span>Scott</span>和<span>Herb</span>的书更能轻松而立竿见影地获得更大的提高。我个人很喜欢这本书的写作风格 — <span>Stephen</span>的许多观点看似极端却无可辩驳。当然了，这种自信（以及冷幽默）来自于作者深厚的技术素养，而非自大的偏执。</span></p>
<p>&#160;</p>
<p><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">除了上面推荐的书籍外，<span>Dov Bulka</span>和<span> David Mayhew</span>合著的<span style="COLOR: navy">《<span>Efficient C++: Performance Programming Techniques</span>》（《提高<span>C++</span>性能的编程技术》，清华大学出版社）</span>也值得一看<span style="COLOR: navy">。</span>这本超薄小书聚焦于高性能<span>C++</span>应用程序开发。两位作者都是<span>IBM</span>软件专家，都工作于对性能要求极高的系统构建领域，本书是他们的经验之谈。也有人不喜欢这本书，因为它花了不少的篇幅讲述和<span>C++</span>无关的东西，我却恰恰因为这一点而对这本书产生好感，正是这些东西让我开阔了眼界。</span></p>
<p>&#160;</p>
<p><strong><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">模板和泛型编程</span></strong></p>
<p>&#160;</p>
<p><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">模板和基于模板的泛型编程无疑是当今发展最活跃的<span>C++</span>程序设计技术。模板的第一个革命性的应用是<span>STL</span>，它将模板技术在泛型容器和算法领域的运用展现得淋漓尽致，而<span>Boost</span>、<span>Loki</span>等现代程序库则将模板技术的潜能不断发挥到极致。在模板和泛型编程领域，我推荐以下两本重量级著作：</span></p>
<p>&#160;</p>
<p><span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">David Vandevoorde, Nicolai M. Josuttis, C++ Templates: The Complete Guide</span></p>
<p><span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">《<span>C++ Templates</span>全览（繁体版）》，台湾碁峰资讯股份有限公司</span></p>
<p><span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">《<span>C++ Templates</span>全览（简体版）》，人民邮电出版社</span></p>
<p>&#160;</p>
<p><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">有一种老套的赞美一本书的手法，大致是"没有看过这本书，你就怎么怎么地"，这里面往往夸张的成分居多。不过，倘若说"没有看过《</span><span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">C++ Templates: The Complete Guide</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">》，你就不可能精通<span>C++</span>模板编程"，那么这个论断对于世界上绝大多数<span>C++</span>程序员来说是成立的。</span></p>
<p>&#160;</p>
<p><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">这本书填补了<span>C++</span>模板书籍领域由来已久的空白。此前，上有<span style="COLOR: navy">《<span>Modern C++ Design</span>》</span>这样的专注于模板高级编程技术和泛型模式的著作，下有<span style="COLOR: navy">《<span>The C++ Standard Library</span>》</span>这样的针对特定模板框架和组件的使用指南。然而，假如对模板机制缺乏深入的理解，你就很难"上下"自如。鉴于此，我向每一位渴望透彻理解<span>C++</span>模板技术的朋友推荐这本书。</span></p>
<p>&#160;</p>
<p><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">这本书在内地、台湾各有一个译本，但出自不同的译者之手。当你看到这篇文章时，两个译本应该都已经上市，对于读者来说当然也就多了一种选择。侯捷先生个人网站上开放了繁体译本大部分章节，不妨先睹为快。</span></p>
<p>&#160;</p>
<p><span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">Andrei Alexandrescu, Modern C++ Design: Generic Programming and Design Patterns Applied</span></p>
<p><span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">《<span>C++</span>设计新思维：泛型编程与设计模式之应用》，华中科技大学出版社</span></p>
<p><span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">《</span><span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">C++</span><span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">设计新思维</span><span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">（影印版）》，中国电力出版社</span></p>
<p>&#160;</p>
<p><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">你自认为是<span>C++</span>模板编程高手吗？请看过这本书再回答</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: wingdings">J</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体"> </span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">这是一本出自天才之手令人敬畏的杰作。泛型模式，无限延伸你的视野，足以挑战任何一名<span>C++</span>程序员的思维极限。</span></p>
<p>&#160;</p>
<p><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">这本书共分为两大部分，第一部分讨论了<span> Loki</span>程序库采用的基础技术以及一些高级语言特性，包括基于策略的类设计、模板局部特化、编译期断言、<span>Typelist</span>以及小型对象分配技术等。第二部分则着重介绍了<span>Loki</span>中的重要组件和泛型模式技术，包括泛化仿函数（<span>Generalization Functor</span>）、单件（<span>Singleton</span>）、智能指针、对象工厂（<span>Object Factory</span>）、抽象工厂（<span>Abstract Factory</span>）、访问者（<span>Visitor</span>）以及多方法（<span>Multimethods</span>）等。每一种技术都让人大开眼界，叹为观止。</span></p>
<p>&#160;</p>
<p><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">在<span>C++</span>的学习方面，过犹不及往往成了不求甚解的借口。然而，面向对象并非<span>C++</span>的全部，模板和泛型编程亦占半壁江山。对于"严肃"的<span>C++</span>程序员而言，及时跟进这项早经例证的成功技术，不失为明智之举。</span></p>
<p>&#160;</p>
<p><strong><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">结语</span></strong></p>
<p>&#160;</p>
<p><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">这些著作是如此大名鼎鼎，也许根本不缺我一个推荐。然而，纵然<span>C++</span>程序员队伍的发展壮大速度不像其他更时髦的语言那样迅速，新人进总是多于旧人出。除了热忱地欢迎新人，我个人认为到了对<span>C++</span>书籍进行"盘点"的时候了，并且希望这样的"盘点"有益于感兴趣的读者。请保持耐心和宽厚。在下篇中，我将继续介绍标准库、网络编程以及其他方面的<span>C++</span>好书。有好书相伴，这个冬天不会冷。</span></p>
<p>&#160;</p>
<p style="TEXT-ALIGN: right" align=right><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">荣耀</span></p>
<img src ="http://www.cnitblog.com/benwhite/aggbug/25201.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/benwhite/" target="_blank">BenWhite</a> 2007-04-04 20:28 <a href="http://www.cnitblog.com/benwhite/articles/25201.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>