官术网_书友最值得收藏!

前言

拿起畫筆,和我們一起畫畫吧!

——Bob Ross

系統(tǒng)編程的需求是巨大的。隨著瀏覽器、移動(dòng)設(shè)備和物聯(lián)網(wǎng)應(yīng)用于我們的生活,也許從來沒有一個(gè)時(shí)刻像現(xiàn)在這樣,這是人們成為一名系統(tǒng)程序員的最佳時(shí)機(jī)。在任何情況下我們都需要高效、可維護(hù)和正確的代碼,而我堅(jiān)信C++是最適合這項(xiàng)工作的語言。

在經(jīng)驗(yàn)豐富的程序員手中,C++可以產(chǎn)生比地球上任何其他系統(tǒng)編程語言所能產(chǎn)生的更小、更高效、更可讀的代碼。它是一種致力于實(shí)現(xiàn)零開銷抽象機(jī)制的語言——因此程序可以快速地被開發(fā),同時(shí)也可以簡單、直接地映射到硬件上。因此,當(dāng)需要時(shí),我們也可以進(jìn)行底層控制。當(dāng)用C++編程時(shí),我們其實(shí)已經(jīng)站在了巨人的肩膀上,他們花了幾十年的時(shí)間精心設(shè)計(jì)了一門令人難以置信的強(qiáng)大而靈活的語言。

學(xué)習(xí)C++的一大好處是可以免費(fèi)獲得C++標(biāo)準(zhǔn)庫,即stdlib。stdlib包含三個(gè)相互關(guān)聯(lián)的部分:容器、迭代器和算法。如果你曾經(jīng)手動(dòng)編寫過quicksort算法,或者曾經(jīng)編寫過系統(tǒng)代碼并受到緩沖區(qū)溢出、懸空指針、使用已釋放內(nèi)存和重復(fù)釋放內(nèi)存等問題的困擾,那么你會(huì)喜歡stdlib的。它可以同時(shí)為你提供無與倫比的類型安全、正確性和效率。此外,你會(huì)為代碼的緊湊和富有表現(xiàn)力而欣喜。

C++編程模型的核心是對(duì)象生命周期,它為正確釋放程序所使用的資源(如文件、內(nèi)存和網(wǎng)絡(luò)套接字)提供了強(qiáng)有力的保證,即使在發(fā)生錯(cuò)誤時(shí)。而異常,當(dāng)正確使用時(shí),可以從代碼中去掉大量的錯(cuò)誤檢查。另外,移動(dòng)/復(fù)制語義在管理資源所有權(quán)方面兼顧了安全性、效率和靈活性,而早期的系統(tǒng)編程語言(如C語言)根本沒有提供這類功能。

C++是一門活躍的語言,30多年來,國際標(biāo)準(zhǔn)化組織(International Organization for Standardization,ISO)的C++委員會(huì)定期對(duì)該語言進(jìn)行改進(jìn)。在過去的十幾年中,該標(biāo)準(zhǔn)已經(jīng)發(fā)布了幾個(gè)新版本,即C++11、C++14、C++17和C++20,它們分別于2011年、2014年、2017年和2020年發(fā)布。

當(dāng)我使用“現(xiàn)代C++”(modern C++)這個(gè)術(shù)語時(shí),指的是包含新的功能和范式的最新標(biāo)準(zhǔn)。這些更新對(duì)該語言進(jìn)行了認(rèn)真的改進(jìn),提高了它的表現(xiàn)力、效率、安全性和整體可用性。從某種程度上說,這門語言從未像現(xiàn)在這樣流行,它也不會(huì)很快消失。如果你決定學(xué)習(xí)C++,那么你將在未來幾年內(nèi)得到回報(bào)。

寫作目的

雖然現(xiàn)代C++程序員已經(jīng)可以接觸到一些質(zhì)量非常高的書籍,如Scott Meyer的Effective Modern C++和Bjarne Stroustrup的The C++ Programming Language(第4版),但它們通常是面向高級(jí)程序員的。也有一些介紹性的C++書籍,但因?yàn)樗鼈兪菫槌鯇W(xué)編程的人準(zhǔn)備的,所以往往會(huì)跳過一些關(guān)鍵的細(xì)節(jié)。而對(duì)于有經(jīng)驗(yàn)的程序員來說,往往不知道去哪里學(xué)習(xí)C++。

我更喜歡有意識(shí)地學(xué)習(xí)復(fù)雜的命題,從其最基本的元素開始建立概念。C++之所以獲得“C++是一門復(fù)雜的語言”的評(píng)價(jià),是因?yàn)樗幕驹鼐o密地嵌套在一起,使得我們很難對(duì)這門語言有一個(gè)完整的認(rèn)識(shí)。當(dāng)我自己學(xué)習(xí)C++的時(shí)候,我不得不輾轉(zhuǎn)于書本、視頻和疲憊的同事之間,費(fèi)盡心思地去弄懂這門語言。基于此,我寫了這本我認(rèn)為很早之前就應(yīng)該有的書。

讀者對(duì)象

本書是為已經(jīng)熟悉基本編程概念的中高級(jí)程序員編寫的。如果你沒有專門的系統(tǒng)編程經(jīng)驗(yàn),那沒關(guān)系,本書也適合有經(jīng)驗(yàn)的應(yīng)用程序員。

注意 如果你是一名經(jīng)驗(yàn)豐富的C語言程序員或者有抱負(fù)的系統(tǒng)程序員,想知道是否應(yīng)該學(xué)習(xí)C++,請(qǐng)務(wù)必閱讀“致C語言程序員”,以了解詳情。

本書內(nèi)容

本書分為兩部分。第一部分討論C++語言核心。讀者不需要按時(shí)間順序?qū)W習(xí)C++語言(即從C++98開始一直學(xué)到現(xiàn)代的C++11/14/17),而是可以直接學(xué)習(xí)地道的現(xiàn)代C++。第二部分介紹C++標(biāo)準(zhǔn)庫(stdlib),在這里讀者將學(xué)到最重要的基本概念。

第一部分 C++語言核心

? 第1章:啟動(dòng)和運(yùn)行 本章將幫助你建立C++開發(fā)環(huán)境。你將編譯和運(yùn)行第一個(gè)程序,并學(xué)習(xí)如何調(diào)試它。

? 第2章:類型 本章將探索C++類型系統(tǒng)。你將了解基本類型,這是所有其他類型的基礎(chǔ)。你也將了解普通數(shù)據(jù)類和全功能類。你還將深入了解構(gòu)造函數(shù)、初始化和析構(gòu)函數(shù)的作用。

? 第3章:引用類型 本章介紹存儲(chǔ)其他對(duì)象的內(nèi)存地址的對(duì)象。這種類型是許多重要的編程模式的基石,它能夠產(chǎn)生靈活、高效的代碼。

? 第4章:對(duì)象生命周期 本章在存儲(chǔ)期的背景下繼續(xù)討論類的不變量和構(gòu)造函數(shù)。同時(shí),本章將探討析構(gòu)函數(shù)與資源獲取即初始化(Resource Acquisition Is Initialization,RAII)范式。你將了解異常機(jī)制,以及它如何保證類的不變量、如何完善RAII。在了解了移動(dòng)和復(fù)制語義后,你將探索如何用構(gòu)造函數(shù)和賦值運(yùn)算符來操作它們。

? 第5章:運(yùn)行時(shí)多態(tài) 本章介紹接口,接口是一個(gè)允許你編寫運(yùn)行時(shí)的多態(tài)代碼的編程概念。你將學(xué)習(xí)繼承和對(duì)象組合的基礎(chǔ)知識(shí),這是在C++中使用接口的基礎(chǔ)。

? 第6章:編譯時(shí)多態(tài) 本章介紹模板,這也是一種允許你編寫多態(tài)代碼的語言特性。你還將探索將被添加到未來C++版本中的一個(gè)語言特性concept,以及允許你將對(duì)象從一種類型轉(zhuǎn)換為另一種類型的類型轉(zhuǎn)換函數(shù)。

? 第7章:表達(dá)式 你將深入研究操作數(shù)和運(yùn)算符。在牢牢掌握類型、對(duì)象生命周期和模板之后,你將進(jìn)入C++語言核心部分的學(xué)習(xí),而表達(dá)式便是切入點(diǎn)。

? 第8章:語句 本章探討組成函數(shù)的元素。你將學(xué)習(xí)表達(dá)式語句、復(fù)合語句、聲明語句、迭代語句和跳轉(zhuǎn)語句。

? 第9章:函數(shù) 本章討論如何將語句變成工作單元。你將學(xué)習(xí)函數(shù)定義、返回類型、重載解析、可變參數(shù)函數(shù)、可變參數(shù)模板和函數(shù)指針等。你還將學(xué)習(xí)使用函數(shù)調(diào)用運(yùn)算符和lambda表達(dá)式創(chuàng)建可調(diào)用的用戶自定義類型的方法。你將探索std::function——一個(gè)存儲(chǔ)可調(diào)用對(duì)象的容器類。

第二部分 C++庫和框架

? 第10章:測試 本章介紹單元測試和模擬框架。你將練習(xí)測試驅(qū)動(dòng)開發(fā),為自動(dòng)駕駛系統(tǒng)開發(fā)軟件,同時(shí)學(xué)習(xí)一些框架,如Boost Test、Google Test、Google Mock等。

? 第11章:智能指針 本章介紹標(biāo)準(zhǔn)庫為處理動(dòng)態(tài)對(duì)象的所有權(quán)提供的特殊實(shí)用類。

? 第12章:工具庫 本章介紹標(biāo)準(zhǔn)庫和Boost庫中用于處理常見編程問題的類型、類和函數(shù)。你將了解數(shù)據(jù)結(jié)構(gòu)、數(shù)值函數(shù)和隨機(jī)數(shù)生成器。

? 第13章:容器 本章介紹Boost庫和標(biāo)準(zhǔn)庫中的許多特殊數(shù)據(jù)結(jié)構(gòu),它們可以幫助你組織數(shù)據(jù)。你將了解順序容器、關(guān)聯(lián)容器和無序關(guān)聯(lián)容器。

? 第14章:迭代器 迭代器是容器和字符串之間的接口。本章介紹不同類型的迭代器以及如何設(shè)計(jì)它們以便更靈活地編寫程序。

? 第15章:字符串 本章介紹如何在單一容器中處理人類語言數(shù)據(jù)。你將了解內(nèi)置于字符串中的特殊設(shè)施(facility),這些設(shè)施可以讓你執(zhí)行一些簡單的任務(wù)。

? 第16章:流 本章介紹支撐輸入和輸出操作的主要概念。你將學(xué)習(xí)如何用格式化和非格式化的操作處理輸入與輸出流,以及如何使用操縱符。你還將學(xué)習(xí)如何從文件中讀取數(shù)據(jù)以及如何向文件寫入數(shù)據(jù)。

? 第17章:文件系統(tǒng) 本章介紹標(biāo)準(zhǔn)庫中用于操作文件系統(tǒng)的工具。你將學(xué)習(xí)如何構(gòu)建和操作路徑,如何檢查文件和目錄,以及如何枚舉目錄結(jié)構(gòu)。

? 第18章:算法 本章介紹標(biāo)準(zhǔn)庫中可以輕松解決的幾十個(gè)問題。你將了解這些高質(zhì)量算法令人驚訝的適用范圍。

? 第19章:并發(fā)和并行 本章介紹一些簡單的多線程編程方法,這些方法是標(biāo)準(zhǔn)庫的一部分。你將了解future、互斥量、條件變量和原子類型。

? 第20章:用Boost Asio進(jìn)行網(wǎng)絡(luò)編程 本章介紹如何構(gòu)建通過網(wǎng)絡(luò)進(jìn)行通信的高性能程序。你將了解如何使用Boost Asio的阻塞式和非阻塞式輸入與輸出。

? 第21章:編寫應(yīng)用程序 這是本書的收尾部分,討論了幾個(gè)重要的主題。你將了解程序支持設(shè)施,這些設(shè)施可以幫助你構(gòu)建更加完整的應(yīng)用程序。你還將了解Boost ProgramOptions,這個(gè)庫可以讓你直接編寫接受用戶輸入的控制臺(tái)應(yīng)用程序。

注意 請(qǐng)?jiān)L問配套網(wǎng)站https://ccc.codes/獲得本書中的代碼。

致謝

首先,感謝我的家人給我創(chuàng)作空間,我花了兩倍的時(shí)間才寫出我計(jì)劃的一半內(nèi)容,感謝他們的耐心陪伴,我欠他們的無法估量。

感謝Kyle Willmon和Aaron Bray,是他們教會(huì)了我C++;感謝Tyler Ortman,是他把這本書從提案中“孕育”了出來;感謝Bill Pollock,是他潤色了本書;感謝Chris Cleveland、Patrick De Justo、Anne Marie Walker、Annie Choi、Meg Sneeringer和Riley Hoffman,是他們一流的編輯能力讓本書變得更好;感謝早期的讀者,是他們提供了不可估量的反饋。

最后,感謝Jeff Lospinoso,他把那本翻過很多遍、沾滿咖啡的“駱駝書”[1]送給了他那年僅10歲的侄子,幫他點(diǎn)燃了編程的火花。


[1] “駱駝書”指《Perl編程語言》,O’Reilly出版。——譯者注

主站蜘蛛池模板: 临西县| 米林县| 武城县| 喀什市| 共和县| 澜沧| 达孜县| 汨罗市| 竹山县| 白山市| 双江| 太和县| 泊头市| 驻马店市| 安乡县| 长寿区| 吕梁市| 龙里县| 泰来县| 乐业县| 彭州市| 阳春市| 甘谷县| 房产| 宝山区| 沁源县| 通化县| 泗洪县| 西峡县| 行唐县| 永昌县| 高尔夫| 花莲市| 饶河县| 家居| 南开区| 车致| 延边| 龙里县| 许昌县| 启东市|