天天看點

《深入了解C++11:C++ 11新特性解析與應用》——導讀

《深入了解C++11:C++ 11新特性解析與應用》——導讀

為什麼要寫這本書

相比其他語言的頻繁更新,c++語言标準已經有十多年沒有真正更新過了。而上一次标準制定,正是面向對象概念開始盛行的時候。較之基于過程的程式設計語言,基于面向對象、泛型程式設計等概念的c++無疑是非常先進的,而c++98标準的制定以及各種符合标準的編譯器的出現,又在客觀上推動了程式設計方法的革命。是以在接下來的很多年中,似乎人人都在學習并使用c++。商業公司在邀請c++專家為程式員講課,學校裡老師在為學生繪聲繪色地講解面向對象程式設計,c++的書籍市場也是百花齊放,論壇、bbs的c++闆塊則充斥了大量各種關于c++的讨論。随之而來的,招聘啟事寫着“要求熟悉c++程式設計”,派生與繼承成為了面試官審視畢業生基礎知識的重點。凡此種種,不一而足。于是c++語言“病毒性”地蔓延到各種程式設計環境,成為了使用最為廣泛的程式設計語言之一。

十來年的時光轉瞬飛逝,各種程式設計語言也在快馬加鞭地向前發展。如今流行的程式設計語言幾乎無一不支援面向對象的概念。即使是古老的語言,也通過了制定新标準,開始支援面向對象程式設計。随着web開發、移動開發逐漸盛行,一些新流行起來的程式設計語言,由于在應用的快速開發、調試、部署上有着獨特的優勢,逐漸成為了這些新領域中的主流。不過這并不意味着c++正在失去其陣地。身為c的“後裔”,c++繼承了c能夠進行底層操作的特性,是以,使用c/c++編寫的程式往往具有更佳的運作時性能。在建構包括作業系統的各種軟體層,以及建構一些對性能要求較高的應用程式時,c/c++往往是最佳選擇。更一般地講,即使是由其他語言編寫的程式,往往也離不開由c/c++編寫的編譯器、運作庫、作業系統,或者虛拟機等提供支援。是以,c++已然成為了程式設計技術中的中流砥柱。如果用個比喻來形容c++,那麼可以說這十來年c++正是由“鋒芒畢露”的青年時期走向“成熟穩重”的中年時期。

不過十來年對于程式設計語言來說也是個很長的時間,長時間的沉寂甚至會讓有的人認為,c++就是這樣一種語言:特性穩定,性能出色,易于學習而難于精通。長時間使用c++的程式員也都熟悉了c++毛孔裡每一個特性,甚至是現實上的一些細微的差別,比如各種編譯器對c++擴充的差別,也都熟稔于心。于是這個時候,c++11标準的橫空出世,以及c++之父bjarne stroustrup的一句“看起來像一門新語言”的說法,無疑讓很多c++程式員有些誠惶誠恐:c++11是否又帶來了程式設計思維的革命?c++11是否保持了對c++98及c的相容?舊有的c++程式到了c++11是否需要被推倒重來?

事實上這些擔心都是多餘的。相比于c++98帶來的面向對象的革命性,c++11帶來的卻并非“翻天覆地”式的改變。很多時候,程式員保持着“c++98式”的觀點來看待c++11代碼也同樣是合理的。因為在程式設計思想上,c++11依然遵從了一貫的面向對象的思想,并深入加強了泛型程式設計的支援。從我們的觀察來看,c++11更多的是對步入“成熟穩重”的中年時期的c++的一種改造。比如,像auto類型推導這樣的新特性,展現出的是語言的親和力;而右值引用、移動語義的特性,則着重于改變一些使用c++程式庫時容易發生的性能不佳的狀況。當然,c++11中也有局部的創新,比如lambda函數的引入,以及原子類型的設計等,都展現了語言與時俱進的活力。語言的諸多方面都在c++11中再次被錘煉,進而變得更加合理、更加條理清晰、更加易用。 c++11對c++語言改進的每一點,都呈現出了經過長時間技術沉澱的程式設計語言的特色與風采。是以從這個角度上看,學習c++11與c++98在思想上是一脈相承的,程式員可以用較小的代價對c++的知識進行更新換代。而在現實中,隻要修改少量已有代碼(甚至不修改),就可以使用c++11編譯器對舊有代碼進行更新編譯而獲得新标準帶來的好處,這也非常具有實用性。是以,從很多方面來看,c++程式員都應該樂于更新換代已有的知識,而學習及使用c++11也正是大勢所趨。

在本書開始編寫的時候,c++11标準剛剛釋出一年,而本書出版的時候,c++11也隻不過才誕生了兩年。這一兩年,各個編譯器廠商或者組織都将支援c++11新特性作為了一項重要工作。不過由于c++11的語言特性非常的多,是以本書在接近完成時,依然沒有一款編譯器支援c++11所有的新特性。但從從業者的角度看,c++11遲早會普及,也遲早會成為c++程式員的首選,是以即使現階段編譯器對c++新特性的支援還不充分,但還是有必要在這個時機推出一本全面介紹c++11新特性的中文圖書。希望通過這樣的圖書,使得更多的中國程式員能夠最快地了解c++11新語言标準的方方面面,并且使用最新的c++11編譯器來從各方面提升自己編寫的c++程式。

ibm xl編譯器中國開發團隊

[第1章 新标準的誕生

1.1.1 c++11/c++0x(以及c11/c1x)—新标準誕生

1.1.2 什麼是c++11/c++0x

1.1.3 新c++語言的設計目标

<a href="https://yq.aliyun.com/articles/173861/">1.2 今時今日的c++</a>

1.2.1 c++的江湖地位

1.2.2 c++11語言變化的領域

<a href="https://yq.aliyun.com/articles/173867/">1.3 c++11特性的分類</a>

<a href="https://yq.aliyun.com/articles/173868/">1.4 c++特性一覽</a>

1.4.1 穩定性與相容性之間的抉擇

1.4.2 更傾向于使用庫而不是擴充語言來實作特性

1.4.3 更傾向于通用的而不是特殊的手段來實作特性

1.4.4 專家新手一概支援

1.4.5 增強類型的安全性

1.4.6 與硬體緊密合作

1.4.7 開發能夠改變人們思維方式的特性

1.4.8 融入程式設計現實

<a href="https://yq.aliyun.com/articles/173888/">1.5 本書的約定</a>

1.5.1 關于一些術語的翻譯

1.5.2 關于代碼中的注釋

1.5.3 關于本書中的代碼示例與實驗平台

[第2章 保證穩定性和相容性

2.1.1 預定義宏

2.1.2 __func__預定義辨別符

2.1.3 _pragma操作符

2.1.4 變長參數的宏定義以及__va_args__

2.1.5 寬窄字元串的連接配接

<a href="https://yq.aliyun.com/articles/173910/">2.2 long long整型</a>

<a href="https://yq.aliyun.com/articles/173916/">2.3 擴充的整型</a>

<a href="https://yq.aliyun.com/articles/173919/">2.4 宏__cplusplus</a>

<a href="https://yq.aliyun.com/articles/173930/">2.5 靜态斷言</a>

2.5.1 斷言:運作時與預處理時

2.5.2 靜态斷言與static_assert

<a href="https://yq.aliyun.com/articles/173942/">2.6 noexcept修飾符與noexcept操作符</a>

<a href="https://yq.aliyun.com/articles/173951/">2.7 快速初始化成員變量</a>

<a href="https://yq.aliyun.com/articles/173959/">2.8 非靜态成員的sizeof</a>

<a href="https://yq.aliyun.com/articles/173966/">2.9 擴充的friend文法</a>

<a href="https://yq.aliyun.com/articles/173981/">2.10 final/override控制</a>

<a href="https://yq.aliyun.com/articles/173991/">2.11 模闆函數的預設模闆參數</a>

<a href="https://yq.aliyun.com/articles/173997/">2.12 外部模闆</a>

2.12.1 為什麼需要外部模闆

2.12.2 顯式的執行個體化與外部模闆的聲明

<a href="https://yq.aliyun.com/articles/174007/">2.13 局部和匿名類型作模闆實參</a>

<a href="https://yq.aliyun.com/articles/174010/">2.14 本章小結</a>

[第3章 通用為本,專用為末

<a href="https://yq.aliyun.com/articles/174024/">3.2 委派構造函數</a>

<a href="https://yq.aliyun.com/articles/174044/">3.3 右值引用:移動語義和完美轉發</a>

3.3.1 指針成員與拷貝構造

3.3.2 移動語義

3.3.3 左值、右值與右值引用

3.3.4 std::move:強制轉化為右值

3.3.5 移動語義的一些其他問題

3.3.6 完美轉發

<a href="https://yq.aliyun.com/articles/174067/">3.4 顯式轉換操作符</a>

繼續閱讀