C++ Primer第五版之二:語言修訂對寫作策略的影響

openkk 12年前發布 | 28K 次閱讀 C/C++

        英文原文:C++ Primer 5th Edition, Part 2: How Language Revisions Change Strategy

        在上篇文章中,我提到了這樣一個觀點: 作者在采取修訂的方式寫書的時候,把新的內容自然地融入到全書當中,比直接把所有新內容砸到一個章節里顯得更加合理。不過采取這樣的做法,會給讀者的學習 造成一定的困難,尤其是在新加入的內容使得原有的知識更加抽象的前提下——根據我與 C++ 打交道 30 年來的經驗,C++的發展一直是讓這門語言越來越抽象的。

        下面舉個例子說明這種現象。給C語言加上類的支持的最初目的,是為了讓 C++ 類能夠向上兼容C的結構體。尤其是,在早期版本的拷貝構造函數里(大約是 1984 年左右的版本),如果沒有顯示定義拷貝構造函數,那么拷貝一個類的時候,僅僅是拷貝其內部的C結構體。那時的程序員管這種操作叫“按位拷貝” (bitwise copy)。這種拷貝行為在下面的例子中會產生問題:

struct Person {
      String firstname, lastname;
};

        當時還沒有標準的 string 庫,因此我使用 String 這個名字來強調這是一個用戶自定義的類,用來實現多字符的串結構。

        在早期的 C++ 版本中,這個類將會成為一個災難。因為 String  類很可能包含了一個指針,這個指針會直接指向存放字符串內容的地址,指針在對 Person 對象進行拷貝時不會被簡單地拷貝過去。這么做可能導致的結果就是,內存中的字符串和可能會面臨兩次 free 操作,一次是針對原來的 Person 對象,另一次是針對 Person 對象的拷貝。如此一來,使用這個版本 C++ 的程序員就必須提供顯示的拷貝構造函數來避免這個問題。

struct Person {
      Person (const Person& p):
   firstname (p.firstname), lastname (p.lastname) { }
                         // and so on       String firstname, lastname;
};

        所有早期 C++ 版本的教學材料都會教給你上面的技術,因為如果你不這么做的話,即使最簡單的抽象過程也會導致嚴重的 bug。顯然,這些復雜的語言特性和隨之帶來的不便推動了對 C++ 語言默認行為的改進:在進行默認對象拷貝時,不會再直接拷貝類的C結構體,C++編譯器會遍歷源類的結構,并遞歸地拷貝所有對象元素到目標對象。

C++ Primer第五版之二:語言修訂對寫作策略的影響

Barbara Moo——《C++ Primer 5th edition》的作者

        設想如果你就是書的作者。通過你的書,你的程序練習例子,讀者卻感到使用顯示拷貝構造函數是那么的困難,這多糟糕!還好,現在這門語言已經改進了,所有這些累贅的代碼都不需要了。但是這時,還需要你作者干什么呢?

        作為作者,你可以遍歷全書,精于細節,找到每一個例子中曾經用到過那些累贅代碼的片段,并進行簡化或者徹底刪掉重寫,讓各種細節都更加合理。或 者,你可以增加一些章節,比如像“如何使用 XXX 新特性”這樣的章節,用來向讀者說明,之前的那些繁文縟節的代碼已經不再需要了。

        盡管第二個做法看上去比第一個做法要省力很多,但是修訂版(第五版)的《C++ Primer》卻采用了第一種策略。在C++11的語法中,很多代碼的書寫方式已經被簡化了,不需要再像以前那么麻煩了。這個特性會在很大程度上影響到本 書對于C++11關鍵知識點的介紹順序。下周,我們會用具體的示例,來探討一下 C++ 語言究竟有哪些改變。

        英文原文:Andrew Koenig  編譯:伯樂在線 – 黃小非

 本文由用戶 openkk 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!