關(guān)于我們
書(shū)單推薦
新書(shū)推薦
|
C++程序設(shè)計(jì)語(yǔ)言
《C++程序設(shè)計(jì)語(yǔ)言》(原書(shū)第4版)是C++領(lǐng)域經(jīng)典的參考書(shū),介紹了C++11的各項(xiàng)新特性和新功能。全書(shū)共分四部分。部分(第1~5章)是引言,包括C++的背景知識(shí),C++語(yǔ)言及其標(biāo)準(zhǔn)庫(kù)的簡(jiǎn)要介紹;第二部分(第6~15章)介紹C++的內(nèi)置類(lèi)型和基本特性,以及如何用它們構(gòu)造程序;第三部分(第16~29章)介紹C++的抽象機(jī)制及如何用這些機(jī)制編寫(xiě)面向?qū)ο蟪绦蚝头盒统绦;第四部分(?0~44章)概述標(biāo)準(zhǔn)庫(kù)并討論一些兼容性問(wèn)題。由于篇幅問(wèn)題,原書(shū)中文版分兩冊(cè)出版,分別對(duì)應(yīng)原書(shū)的至三部分和第四部分。這一冊(cè)為第四部分。
The C++ Programming Language, Fourth Edition所有計(jì)算機(jī)科學(xué)問(wèn)題,都可以通過(guò)引入一個(gè)新的間接層次來(lái)解決,那些已有過(guò)多間接層次的問(wèn)題除外。
——David J. Wheeler與C++98標(biāo)準(zhǔn)相比,C++11標(biāo)準(zhǔn)讓我可以更清晰、更簡(jiǎn)潔而且更直接地表達(dá)自己的想法。而且,新版本的編譯器可以對(duì)程序進(jìn)行更好的檢查并生成更快的目標(biāo)程序。因此,C++11給人的感覺(jué)就像是一種新語(yǔ)言一樣。 在本書(shū)中,我追求完整性(completeness)。我會(huì)介紹專(zhuān)業(yè)程序員可能需要的每個(gè)語(yǔ)言特性和標(biāo)準(zhǔn)庫(kù)組件。對(duì)每個(gè)特性或組件,我將給出: 基本原理:設(shè)計(jì)這個(gè)特性(組件)是為了幫助解決哪類(lèi)問(wèn)題?其設(shè)計(jì)原理是什么?它有什么根本的局限?規(guī)范:它該如何定義?我將以專(zhuān)業(yè)程序員為目標(biāo)讀者來(lái)選擇內(nèi)容的詳略程度,對(duì)于要求更高的C++語(yǔ)言研究者,有很多ISO標(biāo)準(zhǔn)的文獻(xiàn)可供查閱。 例子:當(dāng)單獨(dú)使用這個(gè)特性或與其他特性組合使用時(shí),如何用好它?其中的關(guān)鍵技術(shù)和習(xí)慣用法是怎樣的?在程序的可維護(hù)性和性能方面是否有一些隱含的問(wèn)題?多年來(lái),無(wú)論是C++語(yǔ)言本身還是它的使用,都已經(jīng)發(fā)生了巨大改變。從程序員的角度,大多數(shù)改變都屬于語(yǔ)言的改進(jìn)。與之前的版本相比,當(dāng)前的ISO C++標(biāo)準(zhǔn)(ISO/IEC 14882-2011,通常稱(chēng)為C++11)在編寫(xiě)高質(zhì)量代碼方面無(wú)疑是一個(gè)好得多的工具。但是它好在哪里?現(xiàn)代C++語(yǔ)言支持什么樣的程序設(shè)計(jì)風(fēng)格和技術(shù)?這些技術(shù)靠哪些語(yǔ)言特性和標(biāo)準(zhǔn)庫(kù)特性來(lái)支撐?精練、正確、可維護(hù)性好、性能高的C++代碼的基本構(gòu)建單元是怎樣的?本書(shū)將回答這些關(guān)鍵問(wèn)題。很多答案已經(jīng)不同于1985、1995或2005等舊版本的C++語(yǔ)言了:C++在進(jìn)步。 C++是一種通用程序設(shè)計(jì)語(yǔ)言,它強(qiáng)調(diào)富類(lèi)型、輕量級(jí)抽象的設(shè)計(jì)和使用。C++特別適合開(kāi)發(fā)資源受限的應(yīng)用,例如可在軟件基礎(chǔ)設(shè)施中發(fā)現(xiàn)的那些應(yīng)用。那些花費(fèi)時(shí)間學(xué)習(xí)高質(zhì)量代碼編寫(xiě)技術(shù)的程序員將會(huì)從C++語(yǔ)言受益良多。C++是為那些嚴(yán)肅對(duì)待編程的人而設(shè)計(jì)的。人類(lèi)文明已經(jīng)嚴(yán)重依賴(lài)軟件,編寫(xiě)高質(zhì)量的軟件非常重要。 目前已經(jīng)部署的C++代碼達(dá)到數(shù)十億行,因此程序穩(wěn)定性備受重視——很多1985年和1995年編寫(xiě)的C++代碼仍然運(yùn)行良好,而且還會(huì)繼續(xù)運(yùn)行幾十年。但是,對(duì)所有這些應(yīng)用程序,都可以用現(xiàn)代C++語(yǔ)言寫(xiě)出更好的版本;如果你墨守成規(guī),將來(lái)寫(xiě)出的代碼將會(huì)是低質(zhì)量、低性能的。對(duì)穩(wěn)定性的強(qiáng)調(diào)還意味著,你現(xiàn)在遵循標(biāo)準(zhǔn)寫(xiě)出的代碼,在未來(lái)幾十年中會(huì)運(yùn)行良好。本書(shū)中所有代碼都遵循2011 ISO C++標(biāo)準(zhǔn)。 本書(shū)面向三類(lèi)讀者: 想知道最新的ISO C++標(biāo)準(zhǔn)都提供了哪些新特性的C++程序員。 好奇C++到底提供了哪些超越C語(yǔ)言的特性的C程序員。 具備Java、C#、Python和Ruby等編程語(yǔ)言背景,正在探尋“更接近機(jī)器”的語(yǔ)言,即更靈活、提供更好的編譯時(shí)檢查或是更好性能的語(yǔ)言的程序員。 自然,這三類(lèi)讀者可能是有交集的——一個(gè)專(zhuān)業(yè)軟件開(kāi)發(fā)者通常掌握多門(mén)編程語(yǔ)言。 本書(shū)假定目標(biāo)讀者是程序員。如果你想問(wèn)“什么是for循環(huán)?”或是“什么是編譯器?”,那么本書(shū)現(xiàn)在還不適合你,我向你推薦我的另一本書(shū)《C++程序設(shè)計(jì)原理與實(shí)踐》,這本書(shū)適合作為程序設(shè)計(jì)和C++語(yǔ)言的入門(mén)書(shū)籍。而且,我假定讀者是較為成熟的軟件開(kāi)發(fā)者。如果你的問(wèn)題是“為什么要費(fèi)力進(jìn)行測(cè)試?”或者認(rèn)為“所有語(yǔ)言基本都是一樣的,給我看語(yǔ)法就可以了”,甚至確信存在一種適合所有任務(wù)的完美語(yǔ)言,那么本書(shū)也不適合你。 相對(duì)于C++98,C++11提出了哪些改進(jìn)和新特性呢?適合現(xiàn)代計(jì)算機(jī)的機(jī)器模型會(huì)涉及大量并發(fā)處理。為此,C++11提供了用于系統(tǒng)級(jí)并行編程(如使用多核)的語(yǔ)言和標(biāo)準(zhǔn)庫(kù)特性。C++11還提供了正則表達(dá)式處理、資源管理指針、隨機(jī)數(shù)、改進(jìn)的容器(包括哈希表)以及其他很多特性。此外,C++11還提供了通用和一致的初始化機(jī)制、更簡(jiǎn)單的for語(yǔ)句、移動(dòng)語(yǔ)義、基礎(chǔ)的Unicode支持、lambda表達(dá)式、通用常量表達(dá)式、控制類(lèi)缺省定義的能力、可變參數(shù)模板、用戶定義的字面值常量和其他很多新特性。請(qǐng)記住,這些標(biāo)準(zhǔn)庫(kù)和語(yǔ)言特性的目標(biāo)就是支撐那些用來(lái)開(kāi)發(fā)高質(zhì)量軟件的程序設(shè)計(jì)技術(shù)。這些特性應(yīng)該組合使用——將它們看作蓋大樓的磚,而不應(yīng)該相互隔離地單獨(dú)使用來(lái)解決特定問(wèn)題。計(jì)算機(jī)是一種通用機(jī)器,而C++在其中起著重要作用。特別是,C++的設(shè)計(jì)目標(biāo)就是足夠靈活和通用,以便處理那些連它的設(shè)計(jì)者都未曾想象過(guò)的未來(lái)難題。 致謝除了本書(shū)上一版致謝提及的人之外,我還要感謝Pete Becker、Hans-J. Boehm、Marshall Clow、Jonathan Coe、Lawrence Crowl、Walter Daugherty、J. Daniel Garcia、Robert Harle、Greg Hickman、Howard Hinnant、Brian Kernighan、Daniel Krügler、Nevin Liber、Michel Michaud、Gary Powell、Jan Christiaan van Winkel和Leor Zolman。沒(méi)有他們的幫助,本書(shū)的質(zhì)量要差得多。 感謝Howard Hinnant為我解答很多有關(guān)標(biāo)準(zhǔn)庫(kù)的問(wèn)題。 Andrew Sutton是Origin庫(kù)的作者,模板相關(guān)章節(jié)中很多模擬概念的討論都是基于這個(gè)測(cè)試平臺(tái)的。他還是Matrix庫(kù)的作者,這是第29章的主題。Origin庫(kù)是開(kāi)源的,在互聯(lián)網(wǎng)上搜索“Origin”和“Andrew Sutton”就能找到。 感謝我指導(dǎo)的畢業(yè)設(shè)計(jì)班,他們從第一部分中找出的問(wèn)題比其他任何人都多。 假如我能遵照審閱人的所有建議,毫無(wú)疑問(wèn)會(huì)大幅度提高本書(shū)的質(zhì)量,但篇幅上也會(huì)增加數(shù)百頁(yè)。每個(gè)專(zhuān)家審閱人都建議增加技術(shù)細(xì)節(jié)、進(jìn)階示例和很多有用的開(kāi)發(fā)規(guī)范;每個(gè)新手審閱人(或教育工作者)都建議增加示例;而大多數(shù)審閱人都(正確地)注意到本書(shū)的篇幅可能過(guò)長(zhǎng)了。 感謝普林斯頓大學(xué)計(jì)算機(jī)科學(xué)系,特別感謝Brian Kernighan教授,在我利用部分休假時(shí)間撰寫(xiě)此書(shū)時(shí)給予我熱情接待。 感謝劍橋大學(xué)計(jì)算機(jī)實(shí)驗(yàn)室,特別感謝Andy Hopper教授,在我利用部分休假時(shí)間撰寫(xiě)此書(shū)時(shí)給予我熱情接待。 感謝編輯Peter Gordon以及他在Addison-Wesley的出版團(tuán)隊(duì),感謝你們的幫助和耐心。 Bjarne Stroustrup于得克薩斯大學(xué)城第3版前言The C++ Programming Language, Fourth Edition去編程就是去理解。 ——Kristen Nygaard我覺(jué)得用C++編程比以往更令人愉快。在過(guò)去這些年里,C++在支持設(shè)計(jì)和編程方面取得了令人振奮的進(jìn)步,針對(duì)其使用的大量新技術(shù)已經(jīng)被開(kāi)發(fā)出來(lái)了。然而,C++并不只是好玩。普通的程序員在幾乎所有種類(lèi)和規(guī)模的開(kāi)發(fā)項(xiàng)目上,在生產(chǎn)率、可維護(hù)性、靈活性和質(zhì)量方面都取得了顯著的進(jìn)步。到今天為止,C++已經(jīng)實(shí)現(xiàn)了我當(dāng)初期望中的絕大部分,還在許多我原來(lái)根本沒(méi)有夢(mèng)想過(guò)的工作中取得了成功。 本書(shū)介紹的是標(biāo)準(zhǔn)C++以及由C++所支持的關(guān)鍵編程技術(shù)和設(shè)計(jì)技術(shù)。與本書(shū)第1版所介紹的那個(gè)C++版本相比,標(biāo)準(zhǔn)C++是一個(gè)經(jīng)過(guò)了更仔細(xì)推敲的更強(qiáng)大的語(yǔ)言。各種新的語(yǔ)言特征,如名字空間、異常、模板,以及運(yùn)行時(shí)類(lèi)型識(shí)別,使人能以比過(guò)去更直接的方式使用許多技術(shù),標(biāo)準(zhǔn)庫(kù)使程序員能夠從比基本語(yǔ)言高得多的層面上起步。 本書(shū)第2版中大約有三分之一的內(nèi)容來(lái)自第1版。第3版則重寫(xiě)了更大的篇幅。它提供的許多東西是大部分有經(jīng)驗(yàn)的程序員也需要的,與此同時(shí),本書(shū)也比它的以前版本更容易讓新手入門(mén)。C++使用的爆炸性增長(zhǎng)和由此帶來(lái)的海量經(jīng)驗(yàn)積累使這些成為可能。 一個(gè)功能廣泛的標(biāo)準(zhǔn)庫(kù)定義使我能以一種與以前不同的方式介紹C++的各種概念。與過(guò)去一樣,本書(shū)對(duì)C++的介紹與任何特定的實(shí)現(xiàn)都沒(méi)有關(guān)系;與過(guò)去一樣,教材式的各章還是采用“自下而上”的方式,使每種結(jié)構(gòu)都是在定義之后才使用。無(wú)論如何,使用一個(gè)設(shè)計(jì)良好的庫(kù)遠(yuǎn)比理解其實(shí)現(xiàn)細(xì)節(jié)容易得多。因此,假定讀者在理解標(biāo)準(zhǔn)庫(kù)的內(nèi)部工作原理之前,就可以利用它提供許多更實(shí)際、更有趣的例子。標(biāo)準(zhǔn)庫(kù)本身也是程序設(shè)計(jì)示例和設(shè)計(jì)技術(shù)的豐富源泉。 本書(shū)將介紹每種主要的C++語(yǔ)言特征和標(biāo)準(zhǔn)庫(kù),它是圍繞著語(yǔ)言和庫(kù)功能組織起來(lái)的。當(dāng)然,各種特征都將在使用它們的環(huán)境中介紹。也就是說(shuō),這里所關(guān)注的是將語(yǔ)言作為一種設(shè)計(jì)和編程的工具,而不是語(yǔ)言本身。本書(shū)將展示那些使C++卓有成效的關(guān)鍵技術(shù),講述為掌握它們所需要的基本概念。除了專(zhuān)門(mén)闡釋技術(shù)細(xì)節(jié)的那些地方之外,其他示例都取自系統(tǒng)軟件領(lǐng)域。另一本與本書(shū)配套出版的書(shū)《帶標(biāo)注的C++語(yǔ)言標(biāo)準(zhǔn)》(The Annotated C++ Language Standard),將給出完整的語(yǔ)言定義,所附標(biāo)注能使它更容易理解。 本書(shū)的基本目標(biāo)就是幫助讀者理解C++所提供的功能將如何支持關(guān)鍵的程序設(shè)計(jì)技術(shù)。這里的目標(biāo)是使讀者能遠(yuǎn)遠(yuǎn)超越簡(jiǎn)單地復(fù)制示例并使之能夠運(yùn)行,或者模仿來(lái)自其他語(yǔ)言的程序設(shè)計(jì)風(fēng)格。只有對(duì)隱藏在語(yǔ)言背后的思想有了很好的理解之后,才能真正掌握這個(gè)語(yǔ)言。如果有一些具體實(shí)現(xiàn)的文檔的輔助,這里所提供的信息就足以對(duì)付具有挑戰(zhàn)性的真實(shí)世界中的重要項(xiàng)目。我的希望是,本書(shū)能幫助讀者獲得新的洞察力,使他們成為更好的程序員和設(shè)計(jì)師。 致謝除了第1版和第2版的致謝中所提到的那些人之外,我還要感謝Matt Austern、Hans Boehm、Don Caldwell、Lawrence Crowl、Alan Feuer、Andrew Forrest、David Gay、Tim Griffin、Peter Juhl、Brian Kernighan、Andrew Koenig、Mike Mowbray、Rob Murray、Lee Nackman、Joseph Newcomer、Alex Stepanov、David Vandevoorde、Peter Weinberger和Chris Van Wyk,他們對(duì)第3版各章的初稿提出了許多意見(jiàn)。沒(méi)有他們的幫助和建議,這本書(shū)一定會(huì)更難理解,包含更多的錯(cuò)誤,沒(méi)有這么完整,當(dāng)然也可能稍微短一點(diǎn)。 我還要感謝C++標(biāo)準(zhǔn)化委員會(huì)的志愿者們,是他們完成了規(guī)模宏大的建設(shè)性工作,才使C++具有它今天這個(gè)樣子。要羅列出每個(gè)人會(huì)有一點(diǎn)不公平,但一個(gè)也不提就更不公平,所以我想特別提及Mike Ball、Dag Brück、Sean Corfield、Ted Goldstein、Kim Knuttila、Andrew Koenig、Dmitry Lenkov、Nathan Myers、Martin O’Riordan、Tom Plum、Jonathan Shopiro、John Spicer、Jerry Schwarz、Alex Stepanov和Mike Vilot,他們中的每個(gè)人都在C++及其標(biāo)準(zhǔn)庫(kù)的某些方面直接與我合作過(guò)。 在這本書(shū)第一次印刷之后,許多人給我發(fā)來(lái)電子郵件,提出更正和建議。我已經(jīng)在本書(shū)的結(jié)構(gòu)中響應(yīng)了他們的建議,使后來(lái)出版的版本大為改善。將本書(shū)翻譯到各種語(yǔ)言的譯者也提供了許多澄清性的意見(jiàn)。作為對(duì)這些讀者的回應(yīng),我增加了附錄D和附錄E。讓我借這個(gè)機(jī)會(huì)感謝他們之中特別有幫助的幾位:Dave Abrahams、Matt Austern、Jan Bielawski、Janina Mincer Daszkiewicz、Andrew Koenig、Dietmar Kühl、Nicolai Josuttis、Nathan Myers、Paul E. Sevin?、Andy Tenne-Sens、Shoichi Uchida、Ping-Fai(Mike) Yang和Dennis Yelle。 Bjarne Stroustrup于新澤西默里山第2版前言The C++ Programming Language, Fourth Edition前路漫漫。 ——Bilbo Baggins正如在本書(shū)的第1版中所承諾的,C++為滿足其用戶的需要正在不斷地演化。這一演化過(guò)程得益于許多有著極大的背景差異,在范圍廣泛的應(yīng)用領(lǐng)域中工作的用戶們的實(shí)際經(jīng)驗(yàn)的指導(dǎo)。在第1版出版后的六年中,C++的用戶群體擴(kuò)大了不止百倍,人們學(xué)到了許多東西,發(fā)現(xiàn)了許多新技術(shù)并通過(guò)了實(shí)踐的檢驗(yàn)。這些技術(shù)中的一些也在這一版中有所反映。 在過(guò)去六年里所完成的許多語(yǔ)言擴(kuò)展,其基本宗旨就是將C++提升為一種服務(wù)于一般性的數(shù)據(jù)抽象和面向?qū)ο蟪绦蛟O(shè)計(jì)的語(yǔ)言,特別是提升為一個(gè)可編寫(xiě)高質(zhì)量的用戶定義類(lèi)型庫(kù)的工具。一個(gè)“高質(zhì)量的庫(kù)”是指這樣的庫(kù),它以一個(gè)或幾個(gè)方便、安全且高效的類(lèi)的形式,給用戶提供了一個(gè)概念。在這個(gè)環(huán)境中,安全意味著這個(gè)類(lèi)在庫(kù)的使用者與它的供方之間構(gòu)成了一個(gè)特殊的類(lèi)型安全的界面;高效意味著與手工寫(xiě)出的C代碼相比,這種庫(kù)的使用不會(huì)給用戶強(qiáng)加明顯的運(yùn)行時(shí)間上或空間上的額外開(kāi)銷(xiāo)。 本書(shū)介紹的是完整的C++語(yǔ)言。從第1章到第10章是一個(gè)教材式的導(dǎo)引,第11章到第13章展現(xiàn)的是一個(gè)有關(guān)設(shè)計(jì)和軟件開(kāi)發(fā)問(wèn)題的討論,最后包含了完整的C++參考手冊(cè)。自然,在原來(lái)版本之后新加入的特征和變化已成為這個(gè)展示的有機(jī)組成部分。這些特征包括:經(jīng)過(guò)精化后的重載解析規(guī)則和存儲(chǔ)管理功能,以及訪問(wèn)控制機(jī)制、類(lèi)型安全的連接、const和static成員函數(shù)、抽象類(lèi)、多重繼承、模板和異常處理。 C++是一個(gè)通用的程序設(shè)計(jì)語(yǔ)言,其核心應(yīng)用領(lǐng)域是最廣泛意義上的系統(tǒng)程序設(shè)計(jì)。此外,C++還被成功地用到許多無(wú)法稱(chēng)為系統(tǒng)程序設(shè)計(jì)的應(yīng)用領(lǐng)域中。從最摩登的小型計(jì)算機(jī)到最大的超級(jí)計(jì)算機(jī)上,以及幾乎所有操作系統(tǒng)上都有C++的實(shí)現(xiàn)。因此,本書(shū)描述的是C++語(yǔ)言本身,并不想試著去解釋任何特殊的實(shí)現(xiàn)、程序設(shè)計(jì)環(huán)境或者庫(kù)。 本書(shū)中給出的許多類(lèi)的示例雖然都很有用,但也還是應(yīng)該歸到“玩具”一類(lèi)。與在完整的精益求精的程序中做解釋相比,這里所采用的解說(shuō)風(fēng)格能更清晰地呈現(xiàn)那些具有普遍意義的原理和極其有用的技術(shù),在實(shí)際例子中它們很容易被細(xì)節(jié)所淹沒(méi)。這里給出的大部分有用的類(lèi),如鏈接表、數(shù)組、字符串、矩陣、圖形類(lèi)、關(guān)聯(lián)數(shù)組等,在廣泛可用的各種商品和非商品資源中,都有可用的“防彈”或“金盤(pán)”版本。那些“具有工業(yè)強(qiáng)度”的類(lèi)和庫(kù)中的許多東西,實(shí)際上不過(guò)是在這里可以找到的玩具版本的直接或間接后裔。 與第1版相比,這一版更加強(qiáng)調(diào)本書(shū)在教學(xué)方面的作用。然而,這里的敘述仍然是針對(duì)有經(jīng)驗(yàn)的程序員,并努力不去輕視他們的智慧和經(jīng)驗(yàn)。有關(guān)設(shè)計(jì)問(wèn)題的討論有了很大的擴(kuò)充,作為對(duì)讀者在語(yǔ)言特征及其直接應(yīng)用之外的要求的一種回應(yīng)。技術(shù)細(xì)節(jié)和精確性也有所增強(qiáng)。特別是,這里的參考手冊(cè)體現(xiàn)了在這個(gè)方向上多年的工作。我的目標(biāo)是提供一本具有足夠深度的書(shū)籍,使大部分程序員能在多次閱讀中都有所收獲。換句話說(shuō),這本書(shū)給出的是C++語(yǔ)言,它的基本原理,以及使用時(shí)所需要的關(guān)鍵性技術(shù)。歡迎欣賞! 致謝除了在第1版前言的致謝里所提到的人們之外,我還要感謝Al Aho、Steve Buroff、Jim Coplien、Ted Goldstein、Tony Hansen、Lorraine Juhl、Peter Juhl、Brian Kernighan、Andrew Koenig、Bill Leggett、Warren Montgomery、Mike Mowbray、Rob Murray、Jonathan Shopiro、Mike Vilot和Peter Weinberger,他們對(duì)第2版的初稿提出了許多意見(jiàn)。許多人對(duì)C++從1985年到1991年的開(kāi)發(fā)有很大影響,我只能提及其中幾個(gè):Andrew Koenig,Brian Kernighan,Doug McIlroy和Jonathan Shopiro。還要感謝參考手冊(cè)“外部評(píng)閱”的許多參與者,以及在X3J16的整個(gè)第一年里一直在其中受苦的人們。 Bjarne Stroustrup于新澤西默里山第1版前言The C++ Programming Language, Fourth Edition語(yǔ)言磨礪了我們思維的方式,也決定著我們思考的范圍。 ——B. L. WhorfC++是一種通用的程序設(shè)計(jì)語(yǔ)言,其設(shè)計(jì)就是為了使認(rèn)真的程序員工作得更愉快。除了一些小細(xì)節(jié)之外,C++是C程序設(shè)計(jì)語(yǔ)言的一個(gè)超集。C++提供了C所提供的各種功能,還為定義新類(lèi)型提供了靈活而有效的功能。程序員可以通過(guò)定義新類(lèi)型,使這些類(lèi)型與應(yīng)用中的概念緊密對(duì)應(yīng),從而把一個(gè)應(yīng)用劃分成許多容易管理的片段。這種程序構(gòu)造技術(shù)通常被稱(chēng)為數(shù)據(jù)抽象。某些用戶定義類(lèi)型的對(duì)象包含著類(lèi)型信息,這種對(duì)象就可以方便而安全地用在那種對(duì)象類(lèi)型無(wú)法在編譯時(shí)確定的環(huán)境中。使用這種類(lèi)型的對(duì)象的程序通常被稱(chēng)為是基于對(duì)象的。如果用得好,這些技術(shù)可以產(chǎn)生出更短、更容易理解,而且也更容易管理的程序。 C++里的最關(guān)鍵概念是類(lèi)。一個(gè)類(lèi)就是一個(gè)用戶定義類(lèi)型。類(lèi)提供了對(duì)數(shù)據(jù)的隱藏,數(shù)據(jù)的初始化保證,用戶定義類(lèi)型的隱式類(lèi)型轉(zhuǎn)換,動(dòng)態(tài)類(lèi)型識(shí)別,用戶控制的存儲(chǔ)管理,以及重載運(yùn)算符的機(jī)制等。在類(lèi)型檢查和表述模塊性方面,C++提供了比C好得多的功能。它還包含了許多并不直接與類(lèi)相關(guān)的改進(jìn),包括符號(hào)常量、函數(shù)的在線替換、默認(rèn)函數(shù)參數(shù)、重載函數(shù)名、自由存儲(chǔ)管理運(yùn)算符,以及引用類(lèi)型等。C++保持了C高效處理硬件基本對(duì)象(位、字節(jié)、字、地址等)的能力。這就使用戶定義類(lèi)型能夠在相當(dāng)高的效率水平上實(shí)現(xiàn)。 C++及其標(biāo)準(zhǔn)庫(kù)也是為了可移植性而設(shè)計(jì)的。當(dāng)前的實(shí)現(xiàn)能夠在大多數(shù)支持C的系統(tǒng)上運(yùn)行。C的庫(kù)也能用于C++程序,而且大部分支持C程序設(shè)計(jì)的工具也同樣能用于C++。 本書(shū)的基本目標(biāo)就是幫助認(rèn)真的程序員學(xué)習(xí)這個(gè)語(yǔ)言,并將它用于那些非平凡的項(xiàng)目。書(shū)中提供了有關(guān)C++的完整描述,許多完整的例子,以及更多的程序片段。 致謝如果沒(méi)有許多朋友和同事持之以恒的使用、建議和建設(shè)性的批評(píng),C++絕不會(huì)像它現(xiàn)在這樣成熟。特別地,Tom Cargill、Jim Coplien、Stu Feldman、Sandy Fraser、Steve Johnson、Brian Kernighan、Bart Locanthi、Doug McIlroy、Dennis Ritchie、Larry Rosler、Jerry Schwarz和Jon Shopiro對(duì)語(yǔ)言發(fā)展提供了重要的思想。Dave Presotto寫(xiě)出了流I/O庫(kù)的當(dāng)前實(shí)現(xiàn)。 此外,還有幾百人對(duì)C++及其編譯器的開(kāi)發(fā)做出了貢獻(xiàn):給我提出改進(jìn)的建議,描述所遇到的問(wèn)題,告訴我編譯中的錯(cuò)誤等。我只能提及其中的很少幾位:Gary Bishop,Andrew Hume,Tom Karzes,Victor Milenkovic,Rob Murray,Leonie Rose,Brian Schmult和Gary Walker。 許多人在本書(shū)的撰寫(xiě)過(guò)程中為我提供了幫助,特別值得提出的是Jon Bentley、Laura Eaves、Brian Kernighan、Ted Kowalski、Steve Mahaney、Jon Shopiro,以及參加1985年7月26 ~ 27日俄亥俄州哥倫布貝爾實(shí)驗(yàn)室C++課程的人們。 Bjarne Stroustrup于新澤西默里山
The C++ Programming Language, Fourth Edition
出版者的話 譯者序 前言 第3版前言 第2版前言 第1版前言 第四部分 標(biāo)準(zhǔn)庫(kù) 第30章 標(biāo)準(zhǔn)庫(kù)概覽 2 30.1 引言 2 30.1.1 標(biāo)準(zhǔn)庫(kù)設(shè)施 2 30.1.2 設(shè)計(jì)約束 4 30.1.3 描述風(fēng)格 4 30.2 頭文件 5 30.3 語(yǔ)言支持 9 30.3.1 initializer_list支持 9 30.3.2 范圍for支持 10 30.4 錯(cuò)誤處理 10 30.4.1 異常 10 30.4.2 斷言 14 30.4.3 system_error 15 30.5 建議 23 第31章 STL容器 24 31.1 引言 24 31.2 容器概覽 24 31.2.1 容器表示 27 31.2.2 對(duì)元素的要求 28 31.3 操作概覽 30 31.3.1 成員類(lèi)型 32 31.3.2 構(gòu)造函數(shù)、析構(gòu)函數(shù)和賦值操作 33 31.3.3 大小和容量 34 31.3.4 迭代器 35 31.3.5 元素訪問(wèn) 36 31.3.6 棧操作 36 31.3.7 列表操作 37 31.3.8 其他操作 38 31.4 容器 38 31.4.1 vector 38 31.4.2 鏈表 42 31.4.3 關(guān)聯(lián)容器 44 31.5 容器適配器 53 31.5.1 stack 54 31.5.2 queue 55 31.5.3 priority_queue 56 31.6 建議 57 第32章 STL算法 59 32.1 引言 59 32.2 算法 59 32.2.1 序列 60 32.3 策略實(shí)參 61 32.3.1 復(fù)雜性 62 32.4 不修改序列的算法 63 32.4.1 for_each() 63 32.4.2 序列謂詞 63 32.4.3 count() 63 32.4.4 find() 64 32.4.5 equal()和mismatch() 64 32.4.6 search() 65 32.5 修改序列的算法 66 32.5.1 copy() 66 32.5.2 unique() 67 32.5.3 remove()和replace() 68 32.5.4 rotate()、random_shuffle()和partition() 69 32.5.5 排列 70 32.5.6 fill() 70 32.5.7 swap() 71 32.6 排序和搜索 71 32.6.1 二分搜索 74 32.6.2 merge() 75 32.6.3 集合算法 75 32.6.4 堆 76 32.6.5 lexicographical_compare() 77 32.7 最大值和最小值 78 32.8 建議 79 第33章 STL迭代器 80 33.1 引言 80 33.1.1 迭代器模型 80 33.1.2 迭代器類(lèi)別 81 33.1.3 迭代器萃取 82 33.1.4 迭代器操作 85 33.2 迭代器適配器 85 33.2.1 反向迭代器 86 33.2.2 插入迭代器 88 33.2.3 移動(dòng)迭代器 89 33.3 范圍訪問(wèn)函數(shù) 89 33.4 函數(shù)對(duì)象 90 33.5 函數(shù)適配器 91 33.5.1 bind() 92 33.5.2 mem_fn() 93 33.5.3 function 93 33.6 建議 95 第34章 內(nèi)存和資源 96 34.1 引言 96 34.2 “擬容器” 96 34.2.1 array 97 34.2.2 bitset 99 34.2.3 vector 103 34.2.4 元組 104 34.3 資源管理指針 107 34.3.1 unique_ptr 108 34.3.2 shared_ptr 111 34.3.3 weak_ptr 113 34.4 分配器 115 34.4.1 默認(rèn)分配器 116 34.4.2 分配器萃取 118 34.4.3 指針萃取 119 34.4.4 限域的分配器 119 34.5 垃圾收集接口 121 34.6 未初始化內(nèi)存 123 34.6.1 臨時(shí)緩沖區(qū) 123 34.6.2 raw_storage_iterator 124 34.7 建議 125 第35章 工具 126 35.1 引言 126 35.2 時(shí)間 126 35.2.1 duration 127 35.2.2 time_point 129 35.2.3 時(shí)鐘 131 35.2.4 時(shí)間萃取 132 35.3 編譯時(shí)有理數(shù)運(yùn)算 132 35.4 類(lèi)型函數(shù) 134 35.4.1 類(lèi)型萃取 134 35.4.2 類(lèi)型生成器 138 35.5 其他工具 142 35.5.1 move()和forward() 142 35.5.2 swap() 143 35.5.3 關(guān)系運(yùn)算符 143 35.5.4 比較和哈希type_info 144 35.6 建議 145 第36章 字符串 146 36.1 引言 146 36.2 字符分類(lèi) 146 36.2.1 分類(lèi)函數(shù) 146 36.2.2 字符萃取 147 36.3 字符串 148 36.3.1 string與C風(fēng)格字符串 149 36.3.2 構(gòu)造函數(shù) 151 36.3.3 基本操作 152 36.3.4 字符串I/O 153 36.3.5 數(shù)值轉(zhuǎn)換 154 36.3.6 類(lèi)STL操作 155 36.3.7 find系列函數(shù) 157 36.3.8 子串 158 36.4 建議 159 第37章 正則表達(dá)式 160 37.1 正則表達(dá)式 160 37.1.1 正則表達(dá)式符號(hào)表示 161 37.2 regex 165 37.2.1 匹配結(jié)果 166 37.2.2 格式化 169 37.3 正則表達(dá)式函數(shù) 170 37.3.1 regex_match() 170 37.3.2 regex_search() 171 37.3.3 regex_replace() 172 37.4 正則表達(dá)式迭代器 173 37.4.1 regex_iterator 173 37.4.2 regex_token_iterator 175 37.5 regex_traits 176 37.6 建議 177 第38章 I/O流 178 38.1 引言 178 38.2 I/O流層次 180 38.2.1 文件流 180 38.2.2 字符串流 182 38.3 錯(cuò)誤處理 183 38.4 I/O操作 184 38.4.1 輸入操作 185 38.4.2 輸出操作 187 38.4.3 操縱符 189 38.4.4 流狀態(tài) 190 38.4.5 格式化 194 38.5 流迭代器 200 38.6 緩沖 201 38.6.1 輸出流和緩沖區(qū) 204 38.6.2 輸入流和緩沖區(qū) 205 38.6.3 緩沖區(qū)迭代器 205 38.7 建議 207 第39章 區(qū)域設(shè)置 209 39.1 處理文化差異 209 39.2 類(lèi)locale 211 39.2.1 命名locale 213 39.2.2 比較string 216 39.3 類(lèi)facet 217 39.3.1 訪問(wèn)locale中的facet 218 39.3.2 一個(gè)簡(jiǎn)單的用戶自定義facet 218 39.3.3 locale和facet的使用 221 39.4 標(biāo)準(zhǔn)facet 221 39.4.1 string比較 223 39.4.2 數(shù)值格式化 226 39.4.3 貨幣格式化 231 39.4.4 日期和時(shí)間格式化 235 39.4.5 字符分類(lèi) 238 39.4.6 字符編碼轉(zhuǎn)換 241 39.4.7 消息 244 39.5 便利接口 248 39.5.1 字符分類(lèi) 248 39.5.2 字符轉(zhuǎn)換 248 39.5.3 字符串轉(zhuǎn)換 249 39.5.4 緩沖區(qū)轉(zhuǎn)換 250 39.6 建議 250 第40章 數(shù)值計(jì)算 252 40.1 引言 252 40.2 數(shù)值限制 252 40.2.1 數(shù)值限制宏 255 40.3 標(biāo)準(zhǔn)數(shù)學(xué)函數(shù) 255 40.4 復(fù)數(shù)complex 257 40.5 數(shù)值數(shù)組:valarray 258 40.5.1 構(gòu)造函數(shù)和賦值操作 258 40.5.2 下標(biāo)操作 260 40.5.3 運(yùn)算 261 40.5.4 切片 263 40.5.5 slice_array 265 40.5.6 推廣切片 265 40.6 推廣數(shù)值算法 267 40.6.1 accumulate() 267 40.6.2 inner_product() 268 40.6.3 partial_sum()和adjacent_difference() 269 40.6.4 iota() 270 40.7 隨機(jī)數(shù) 270 40.7.1 引擎 272 40.7.2 隨機(jī)設(shè)備 274 40.7.3 分布 274 40.7.4 C風(fēng)格隨機(jī)數(shù) 277 40.8 建議 278 第41章 并發(fā) 279 41.1 引言 279 41.2 內(nèi)存模型 280 41.2.1 內(nèi)存位置 281 41.2.2 指令重排 282 41.2.3 內(nèi)存序 282 41.2.4 數(shù)據(jù)競(jìng)爭(zhēng) 283 41.3 原子性 285 41.3.1 atomic類(lèi)型 287 41.3.2 標(biāo)志和柵欄 291 41.4 volatile 292 41.5 建議 292 第42章 線程和任務(wù) 293 42.1 引言 293 42.2 線程 293 42.2.1 身份 294 42.2.2 構(gòu)造 295 42.2.3 析構(gòu) 296 42.2.4 join() 297 42.2.5 detach() 298 42.2.6 名字空間this_thread 299 42.2.7 殺死thread 300 42.2.8 thread_local數(shù)據(jù) 300 42.3 避免數(shù)據(jù)競(jìng)爭(zhēng) 302 42.3.1 互斥量 302 42.3.2 多重鎖 309 42.3.3 call_once() 311 42.3.4 條件變量 311 42.4 基于任務(wù)的并發(fā) 315 42.4.1 future和promise 316 42.4.2 promise 317 42.4.3 packaged_task 318 42.4.4 future 320 42.4.5 shared_future 323 42.4.6 async() 323 42.4.7 一個(gè)并行find()示例 325 42.5 建議 328 第43章 C標(biāo)準(zhǔn)庫(kù) 330 43.1 引言 330 43.2 文件 330 43.3 printf()系列函數(shù) 331 43.4 C風(fēng)格字符串 334 43.5 內(nèi)存 335 43.6 日期和時(shí)間 336 43.7 雜項(xiàng) 339 43.8 建議 340 第44章 兼容性 341 44.1 引言 341 44.2 C++11擴(kuò)展 341 44.2.1 語(yǔ)言特性 341 44.2.2 標(biāo)準(zhǔn)庫(kù)組件 343 44.2.3 棄用特性 344 44.2.4 應(yīng)對(duì)舊版本C++實(shí)現(xiàn) 344 44.3 C/C++兼容性 345 44.3.1 C和C++是兄弟 345 44.3.2 “靜默”差異 346 44.3.3 不兼容C++的C代碼 347 44.3.4 不兼容C的C++代碼 350 44.4 建議 351
你還可能感興趣
我要評(píng)論
|