C++ Primer第五版, 第一部分: 如何修订原书

openkk 12年前
   <p>        英文原文:<a href="/misc/goto?guid=4958522166713070176">C++ Primer 5th Edition, Part 1: How To Revise a Textbook</a></p>    <p>        Barbara Moo 已经把完稿的《<a href="http://www.amazon.cn/gp/product/B00114DX08/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&tag=vastwork-23&linkCode=as2&camp=536&creative=3200&creativeASIN=B00114DX08" rel="nofollow" target="_blank">C++ Primer</a>(第五版)》的文本交付给了出版社,这是 7 月 13 号的事情了。据我所知,该书的印刷工作正在进行,8月中旬的时候就应该可以在各大书店上架了。(注:《 <a title="C++Primer 中文版(第 4 版)" href="http://www.amazon.cn/gp/product/B00114DX08/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&tag=vastwork-23&linkCode=as2&camp=536&creative=3200&creativeASIN=B00114DX08" rel="nofollow" target="_blank">C++ Primer</a>》有三位作者:Stanley B. Lippman、Josée Lajoie、Barbara E. Moo)</p>    <p>        本书大概是 Barbara 在过去两年以来最主要的工作内容,尤其是从今年开始,这本书几乎占据了她的全部时间。我也在本书的编写上花费了不少功夫:阅读草稿,写评注和建议,运行测 试程序,等等。这样一来的结果就是,我对作者在写书过程中的思路有了非常好的理解。从我的角度来说,我不仅仅能够告诉你作者的思路和方法,我还能告诉你为 什么我认为她的思路和方法是如此高明,以至于其他的作者都应当借鉴——当然,我很清楚其他的书不会像这本书一样写,对此我也完全不感到惊讶。</p>    <p>        C++11 力图兼容C++03,而C++03 又力图兼容 C++98,C++98 则力图兼容C语言。这个向下兼容的特色是 C++ 如此强大和有用的主要原因之一。因此,通过复习C++03 的书籍中的内容,充分利用 C++ 语言的兼容性,在原先的书籍基础上添加新的章节来介绍C++11的东西,这种思路非常的诱人。采取这样的做法会让事情简单很多:因为原书中的大部分内容不 需要改动。</p>    <p>        当然,这样做的瑕疵就是,语言的新特性会变成一种“附加题”——也就是说,在理解了该语言的所有原有内容后,在“附加练习”时才会去考虑学习这 些新的特性。这样一来,就很可能造成部分读者最后完全没有学到新的东西。举个例子吧,有这么一种现象就是,很多人去学习 C++ 编程,但是他们最后学到的只是如何去用 C++ 的编译器编译C语言程序。在C++11的情况下,也就很可能造成许多人实际上只学到了如何用新的编译器去编译C++03的程序,仅此而已。</p>    <p style="text-align:center;"><a title="ark" rel="lightbox[25199]"><img style="display:block;margin-left:auto;margin-right:auto;" title="ark" alt="C++ Primer第五版, 第一部分: 如何修订原书" src="https://simg.open-open.com/show/a0b206d697d0fc5ed1dfacfe1bb6786d.jpg" width="222" height="334" /></a></p>    <p>本文作者:Andrew Koenig        </p>    <p>        这儿有一个简单的例子可以说明这种现象。假设v是一个 vector    <int>     泛型,我们期望调用一个方法 foo 去遍历v中的每个元素。在C++03里面,我们就可以这么做:    </int></p>    <div class="cnblogs_code">    <pre><span style="color:#0000ff;">for</span> (vector<<span style="color:#0000ff;">int</span>>::iterator it = v.begin (); it := v.end (); ++it)        foo (*it);</pre>   </div>    <p>        如果我们利用C++11的语法代码去实现上述的功能,那写法会非常不同。比如,我们首先写一个例子,看上去像这样:</p>    <div class="cnblogs_code">    <pre><span style="color:#0000ff;">for</span> (decltype (v.size ()) i = ; i != v.size (); ++i)        foo (v[i]);</pre>   </div>    <p>        然后,我们还可以写成这样:</p>    <div class="cnblogs_code">    <pre><span style="color:#0000ff;">for</span> (auto it = v.begin (); it != v.end (); ++it)           foo (it);</pre>   </div>    <p>        甚至是这样:</p>    <div class="cnblogs_code">    <pre><span style="color:#0000ff;">for</span> (auto x: v)        foo (x)</pre>   </div>    <p>        如果一本书教了你前两种写法,那么后面提到的三种写法就成了“附加题”,多数人宁可去坚持使用前两种写法,而完全不去考虑如何记住后面三种写 法。那么从效果来说,这本书就变成了一本“介绍C++03的书,顺带提及了C++11”,读者也就成了“学习C++03编程的人”,而不是学习 C++11。如果真是如此,那么去写一本关于C++11的书,就完全没有必要了。</p>    <p>        Barbara 决定采用最艰难的方式写作:不仅讨论 C++ 语言中的新特性,而且将这些新特性融入到本书的各个章节当中。在接下来的几周时间里,我会跟大家一起讨论一下关于本书中的一些例子,以及她所采取的写作策略。</p>    <p>        英文原文:<a href="/misc/goto?guid=4958522166713070176" rel="nofollow" target="_blank">Andrew Koenig</a>  编译:<a href="/misc/goto?guid=4958338613453938753" target="_blank">伯乐</a>在线 – <a href="/misc/goto?guid=4958522166955877392" target="_blank">黄小非</a></p>