本書是一本面向大學計算機專業的C 程序設計教材,以面向對象程序設計為主線,突出C 的基本特點,介紹C 1y的重要新特性。全書共分為4篇11個單元。
第1篇:C 面向對象起步。用4個單元幫助初學者建立面向對象的問題分析思維,掌握相關方法和語法知識,樹立面向對象程序中一切皆對象,一切來自類的意識,初步領略面向對象程序設計的奧妙。
第2篇:C 面向抽象程序設計。用兩個單元介紹C 的繼承機制,并幫助讀者理解如何在一個程序中組織類,以及什么樣的類結構才是好的程序結構。
第3篇:C 泛型程序設計。用兩個單元介紹多態性和STL。C 的泛型的通用、靈活的特點將給讀者的學習帶來一定樂趣,也為讀者將來從事程序開發工作提供了更多便捷方法。
第4篇:C 深入編程。用3個單元介紹C 實體訪問、函數和I/O流等方面的細節和內容,進一步豐富程序設計語言機制,使讀者在程序開發上能夠錦上添花。
本書理念先進、概念清晰、講解透徹、便于理解。書中例題經典、習題豐富、覆蓋面廣,適合作為高等學校各專業的面向對象程序設計教材。本書還可供培訓機構使用,也可供相關領域人員自學。
零起點,實例引導,輕松入門,逐步深入。? 凸出面向對象思維,彰顯C 精彩,靠攏C 1y。? 注重面向對象的思維訓練和語言藝術的發揮。? 提倡探索式學習。? 彈性大,余味長,鼓勵創新,適合多層次教學。? 大題量、多類型、寬覆蓋面。
前言
(一)
1979年,Bjarne Stroustrup(C 之父)正在準備他的博士畢業論文,他有機會使用一種稱為Simula 的語言。顧名思義,Simula語言主要用于仿真。其Simula 67版被公認是首款支持面向對象的語言。Stroustrup發現面向對象的思想對于軟件開發非常有用,但是因Simula語言執行效率低,其實用性不強。于是他決定自行開發一種面向對象的語言,這就是今日的C 。
筆者一直關心TIOBE社區的程序設計語言排行榜,因為它能為開發和教學人員提供一份程序設計語言的行情變化資料。圖1為2002年到2017年2月之間主要TIOBE程序設計語言排行的變化情況。在這個排行榜上發生了戲劇性變化的程序設計語言就是C 。其第一次戲劇性的變化發生在2004年,在這一年中它的市場份額急劇下滑。但在之后的10年間基本穩定,一直保持在第三位。本書的第1版就是在這樣的情況下編寫的。其第二次戲劇性變化是在本書的第1版出版之后,它先在2014年間急劇下跌,又在2015年奇跡般地回歸。
圖1 2002年到2017年2月TIOBE程序設計語言排行變化情況
C 的這些變化似乎有些莫名其妙,但認真地分析一下,這些變化還是可以解釋的:其一是其他新興語言(主要是C#和Object-C)對于市場份額的分割;其二則是其自身標準變化的影響。下面主要分析第二方面的因素。
C 是Bjarne Stroustrup于1979年準備一個項目時著手開發的一種程序設計語言,1985年被市場化。C 標準委員會于1998年11月推出了其第一個ISO標準(俗稱C 98),2003年推出其ISO標準第2版(俗稱C 03),C 11則是從2005年就開始提交,到2011年8月才發布的C 標準(俗稱C 11,提交時稱為C 0x)。從圖1可以看出,每個標準出臺到影響其市場份額有一個窗口期,這是該標準投石問路的過程。
C 03是C 98的修正版,其初衷是修正C 98的一些不足。但是由于C 脫胎于C,遵循著C是C 子集的原則,同時Bjarne
Stroustrup堅持要保持其適合教學及既支持面向過程又支持面向對象的多泛型特色,成就了其概念清晰、設計嚴密、功能強大、效率較高的優點,但也帶來過于復雜(如指針)、標準庫功能不足,被人稱為有精英化傾向的語言。因此它比較受教育界歡迎,而程序員覺得難用。不過,在通過C 03標準之前,人們還沒有認識到這些問題,反而降低了效率,加劇了其缺陷的影響,使其在2004年遭受到第一次強力沖擊。
20042005年間的滑鐵盧之慘使C 的設計者和標準制定者開始清醒起來,將指導思想修訂如下。
(1)維持與C 98,可能的話還有與C語言之間的兼容性與穩定性。
(2)盡可能通過標準程序庫來引進新的特性,而不是擴展核心語言。
(3)能夠促進編程技術的變更優先。
(4)改進 C 以幫助系統和程序庫的設計,而不是引進只對特定應用有用的新特性。
(5)增強類型安全,給現行不安全的技術提供更安全的替代方案。
(6)增強直接與硬件協同工作的性能和能力。
(7)為現實世界中的問題提供適當的解決方案。
(8)實行零負擔原則(如果某些功能要求額外支持,那么只有在該功能被用到時這些額外的支持才被用到) 。
(9)使C 易于教學。
簡單地說,就是技術優先、安全高效、自由方便。這帶給程序員一個全新的面貌,以至于連C 之父都說它像一種新語言。C 11成功了,它使C 擺脫了連續10年的步步下降,造就了TIOBE曲線2015年的戲劇性變化。
如圖2所示,C 11已經公布四五年了,新的C 14也已經公布,C 17也在緊鑼密鼓地部署之中。但是我國的C 程序設計教學的主流還停留在原始的C 98甚至更舊的版本上。如此嚴重脫離實際的狀況到了該做出改變的時候了。這是筆者對這本C 教材進行改編的動因之一。
圖2 近期C 標準修訂步伐
不過,世界萬物都有慣性。要一下子全部改到C 11上,很多人還是難以接受的,并且筆者自己也還在學習消化之中。在本書中,僅僅給出了C 11的部分新特點的接口,先讓大家了解一下這些性能。在適當的時候,再做較全面和深入的介紹。
(二)
撇開C 11和C 14不談,僅從一般性來講,目前的C 教學也是不盡如人意的,把C 當作C的教學模式還廣泛存在。在本書的第1版中雖然做了不少努力,但還不夠。
Bjarne Stroustrup曾經感慨地說:我不是使用支持工具進行巧妙設計的信徒,但是我強烈支持系統地使用數據抽象、面向對象編程和類屬編程。不擁有支持庫和模板,不進行事先的總體設計,而是埋頭寫下一頁頁的代碼,這是在浪費時間,這是在給維護增加困難。他還認為,一個人對C 了解得越深,在寫C 程序時就越難避免C 的風格,并會因此丟掉C 的某些潛在優勢。為此,他提出了以下幾個相關的要點,在這些情況下做同樣的事情時,在C 中存在比C中更好的處理方式。
(1)在C 中幾乎不需要用宏。用const或enum 定義顯式常量,用inline避免函數調用的額外開銷,用template去刻畫一簇函數或者類型,用namespace 去避免名字沖突。
(2)不用在需要變量之前去聲明它,以保證立即對其進行初始化。聲明可以出現在能出現語句的所有位置上,可以出現在for語句的初始化部分,也可以出現在條件中。
(3)不要用malloc(),new 運算符能將同樣的事情做得更好。對于realloc(),試一試vector()。
(4)試著去避免void*、指針算術、聯合和強制,除了在某些函數或類實現的深層之外。在大部分情況下,強制都是設計錯誤的指示器。如果必須使用某個顯式的類型轉換,設法用一個新的強制,設法寫出一個描述自己想做的事情的更精確的語句。
(5)盡量少用數組和C風格的字符串。與傳統的C風格相比,使用C 標準庫string和vector常常可以簡化程序設計。如果要符合C的連接規則,一個C 函數就必須被聲明為具有C連接的。
最重要的是,要將程序考慮為一組由類和對象表示的相互作用的概念,而不是一堆數據結構和一些去撥弄數據結構中二進制位的函數。
探索如何彰顯C 特色,也是本書改編的重要動因。
(三)
本次修改,將全書劃分為4篇。
第1篇:C 面向對象起步。用4個單元幫助初學者建立面向對象的分析問題的思維,掌握相關方法和相關知識,樹立面向對象程序設計中一切皆對象,一切來自類的意識。
第2篇:C 面向抽象程序設計。用兩個單元幫助讀者理解如何在一個程序中組織類,以及什么樣的類結構才是好的程序結構。
第3篇:C 泛型程序設計。用兩個單元介紹多態性和STL。C 的泛型、通用、靈活的特點給讀者的學習帶來了一定樂趣,也為讀者將來從事程序開發工作提供了更多便捷 方法。
第4篇:C 深入編程。用3個單元介紹C 在名字和實體、常量、函數、I/O流等幾個方面的細節,讓讀者在程序開發上能夠做到錦上添花。進一步提升讀者程序設計=計算思維 語言藝術的觀念。
此外,本書每個單元都圍繞一個主題展開,部分單元還增添了知識鏈接部分,其目的是引申基本內容,或為以后的學習作一些鋪墊。
本書的結構體系安排是考慮了以下幾個因素和寫作思想的結果。
(1)B.S的建議。
(2)重要先學,特色優先。
(3)思維開路,語法補充。
(4)多層次教學需要。
需要說明一點:本書給出的許多示例,雖然有用,但主要用于說明一種語法概念或給出一種編程思路,還不是精益求精的實用程序。
(四)
由J.Piaget、O.Kernberg、R.J.Sternberg、D.Katz、Vogotsgy等人創建的建構主義(constructivism)學習理論認為,知識不是通過教師傳授得到的,而是學習者在一定的情境即社會文化背景下借助其他人(包括教師和學習伙伴)的幫助,利用必要的學習資料,通過意義建構的方式而獲得的。在信息時代,人們獲得知識的途徑發生了根本性的變化,教師不再是單一的傳道、授業、解惑者,幫助學習者構建一個良好的學習環境也成為其一個重要職責。當然,這也是現代教材的責任。本書充分考慮了這些問題。
為了給讀者創造一個良好的學習環境,本書的部分單元設置了知識鏈接欄目。這個欄目的設置可以幫助學習者對C 的機制作更深入的了解,也為精力充沛、不夠消化者提供一點加餐。
除了正文外,在每個單元后面都安排了概念辨析代碼分析開發實踐和探索驗證4種自測和訓練實踐環節,從而建立起一個全面的學習環境。
(1)概念辨析主要提供選擇和判斷兩類自測題目,幫助學習者理解本單元學習過的有關概念,把當前學習內容所反映的事物盡量和自己已經知道的事物相聯系,并認真思考這種聯系,通過自我協商與相互協商,形成新知識的同化與順應。
(2)代碼分析。代碼閱讀是程序設計者所應掌握的基本能力之一。代碼分析部分的主要題型是通過閱讀程序找出錯誤或給出程序執行結果。
(3)開發實踐。提高程序開發能力是本書的主要目標。本書在絕大多數單元后面都給出了相應的作業題目。但是,完成這些題目并非只是簡單地寫出其代碼,而要將其看作一個思維 語法 方法的工程訓練。因此,要求每道題的作業都要以文檔的形式完成。文檔中應包括以下內容。
①
問題分析與建模。
②
源代碼設計。
③
測試用例設計。
④
程序運行結果分析。
⑤
編程心得(包括運行中出現的問題與解決方法、對于測試用例的分析、對于運行結果的分析等)。
⑥
文檔的排版也要遵循統一的格式。
(4)探索驗證。建構主義提倡,學習者要用探索法和發現法去建構知識的意義。學習者要在意義建構的過程中主動地收集和分析有關的信息資料,對碰到的問題提出各種假設,并努力加以驗證。
(五)
筆者從事程序設計教學近30多年。這30多年是在不斷探索中走過來的。從20世紀80年代末,筆者就開始探索程序設計課程從語法體系到問題驅動的改革;到了20世紀90年代中期又在此基礎上考慮讓學生在學習程序設計的同時掌握程序測試技能;2003年開始考慮如何改變學習了C 而設計出的程序卻是面向過程的狀況。每個階段的探索都反映在自己不同時期的相關作品中。本書則是自我認識又一次深化的表達。
在這30多年的探索中,筆者越來越感覺到編寫教材的責任很大、困難很多。要編寫一本好的教材,不僅需要對本課程涉及內容有深刻的了解,還要熟悉相關領域的知識,特別是要不斷探討貫穿其中的教學理念和教育思想。所以,越到后來,就越感到自己知識和能力的不足。可是,作為一項歷史性任務的研究,筆者又不愿意將之半途而廢,只能硬著頭皮寫下去。每一次任務的完成,都得益于一些熱心者的支持和幫助。在本書的寫作過程中,趙忠孝教授、姚威博士、張展為博士以及張秋菊、史林娟、張有明、戴璐、張展赫、董兆軍、吳灼偉(插圖)等參加了有關部分的寫作。在此謹表謝意。同時,一如既往地希望得到讀者廣泛的批評和建議,以便將這本書改得更好。
本書就要出版了。它的出版,是筆者在這項教學改革工作中跨上的一個新的臺階。筆者衷心希望得到有關專家和讀者的批評和建議,也希望能多結交一些志同道合者,把這項教學改革推向更新的境界。
張基溫
丁酉秋于穗小海之畔
·I·
張基溫 研究和教學領域涉及計算機科學與技術、信息管理、信息經濟學、電子政務與電子商務、服務科學,發表論文百余篇,出版著作百余種;先后擔任名古屋大學訪問學者,山西財經大學、江南大學、華東政法大學、華南農業大學珠江學院、常熟理工學院、福建工程學院、廣西職業技術學院、晉城學院等多所大學的專職、客座或兼職教授,北京大學博雅方略城市發展與信息化研究中心研究員,南京大學出版社總編顧問,太原高新技術區IT研究院實驗室主任,山西省緊缺人才專家委員會副主任等職,中國信息經濟學會常務理事,全國高等院校計算機基礎教育研究會常務理事兼課程建設委員會副主任,中國計算機學會教育專業委員會委員,NIT考試委員會委員,江蘇省計算機基礎教學指導委員會委員,山西省新世紀專家學者協會副會長;為清華大學出版社、電子工業出版社、中國水利水電出版社、南京大學出版社等出版社主編了信息管理與信息系統專業、計算機實驗與實踐、大學生信息素養等多個系列教材,已經發表論文百余篇,出版著作百余種。在程序設計教學領域,從20世紀80年代初就開始進行有關研究和改革,嘗試將軟件工程方法和算法思想引入程序設計,倡導從語法體系向問題體系轉變、程序設計 = 思維訓練 語言藝術 工程規范,率先把設計模式及其有關原則引入到面向對象的程序設計教材中。
目錄
第1篇 C 面向對象起步
第1單元 職員類 3
1.1 從具體對象到職員類 3
1.1.1
具體職員對象的分析與描述 3
1.1.2
Employee類的聲明 4
1.1.3
C 保留字、標識符與名字空間 5
1.2
C 基本數據類型 7
1.2.1
C 算術數據類型的表示格式 7
1.2.2
C 算術數據類型的取值范圍 9
1.2.3
C 運算符與算術數據類型的操作集合 10
1.3 表達式 11
1.3.1
字面值 11
1.3.2
數據實體 11
1.3.3
含有操作符的表達式 13
1.3.4
表達式中的隱式數據類型轉換 14
1.4 函數 15
1.4.1
函數的關鍵環節 15
1.4.2
標準輸出流cout與printEmployee() 函數 17
1.4.3
構造函數與析構函數 18
1.4.4
構造函數重載 21
1.4.5
復制構造函數 22
1.4.6
主函數 24
1.5 程序編譯 26
1.5.1
編譯預處理 26
1.5.2
編譯和連接 28
1.5.3
多文件程序的編譯 28
1.6 知識鏈接 30
1.6.1
C 字面值 30
1.6.2
const符號常量 33
1.6.3
指針=基類型 地址 34
1.6.4
指向對象的指針與this 36
1.6.5
引用 38
習題1 39
第2單元 簡單計算器 44
2.1 簡單計算器建模 44
2.1.1
簡單計算器分析 44
2.1.2
Calculator類的聲明 44
2.2
calculate( )函數的實現 45
2.2.1
布爾類型與關系運算符 45
2.2.2
用if-else結構實現成員函數calculate( ) 46
2.2.3
用switch結構實現calculate( ) 48
2.2.4
if-else判斷結構與switch判斷結構比較 49
2.2.5
Calculator類測試 49
2.3
C 異常處理 52
2.3.1
程序錯誤 52
2.3.2
C 異常處理機制 54
2.3.3
C 異常處理技術 55
2.3.4
用類作為異常類型 58
2.3.5
捕獲任何異常 62
2.4 簡單桌面計算器的改進 63
2.4.1
使用浮點數計算的Calculator類 63
2.4.2
標準輸入流與鍵盤輸入 64
2.4.3
簡單多項式計算的實現 67
2.4.4
用重復結構實現任意多項式計算 72
2.5 知識鏈接 74
2.5.1
條件表達式 74
2.5.2
局部變量 74
2.5.3
類屬變量、實例變量與局部變量的比較 76
習題2 76
第3單元 素數產生器 81
3.1 問題描述與對象建模 81
3.1.1
對象建模 81
3.1.2
getPrimeSequence( )函數的基本思路 82
3.2 使用isPrime( )的PrimeGenerator類實現 82
3.2.1
用for結構實現的getPrimeSequence( )函數 82
3.2.2
用for結構實現的isPrime( )函數 84
3.2.3
完整的PrimeGenerator類及其測試 84
3.3 不使用isPrime( )的PrimeGenerator類實現 85
3.3.1
采用嵌套重復結構的getPrimeSequence( )函數 85
3.3.2
重復結構中的continue語句和break語句 86
3.4 數組 87
3.4.1
數組及其定義 87
3.4.2
數組的初始化規則 89
3.4.3
用數組存儲素數序列 90
3.4.4
sizeof操作符 91
3.4.5
C 11中基于容器的for循環 91
3.4.6
數組prime的聲明 92
3.5
string類型 94
3.6 知識鏈接 94
3.6.1
C 操作符 94
3.6.2
左值表達式與右值表達式 96
3.6.3
具有副作用的表達式與序列點 97
3.6.4
表達式類型的推斷與獲取:auto 與decltype 98
3.6.5
類型轉換構造函數與explicit關鍵字 101
3.6.6
C 語句 105
習題3 105
第4單元 Time類 110
4.1
Time類需求分析與操作符重載 110
4.1.1
Time類需求分析 110
4.1.2
關鍵字operator與操作符重載 111
4.1.3
操作符 的重載 112
4.1.4
增量操作符 的重載 113
4.1.5 用友元函數實現<<重載 116
4.1.6
賦值操作符=的重載 117
4.1.7
操作符重載的基本規則 118
4.1.8
Time類的類型轉換構造函數 120
4.2 淺復制與深復制 122
4.2.1
數據復制及其問題 122
4.2.2
復制構造函數再討論 124
4.2.3
深復制的賦值操作符重載 126
4.3 動態內存分配 127
4.3.1
用new進行動態內存分配 127
4.3.2
用delete釋放動態存儲空間 128
4.3.3
對象的動態存儲分配 129
4.3.4
動態內存分配時的異常處理 131
4.4 對象數組 132
4.4.1
對象數組的定義 132
4.4.2
對象數組元素的訪問 133
4.4.3
數組存儲空間的動態分配 134
4.5 知識鏈接 134
4.5.1
友元 134
4.5.2
const修飾類成員與對象 138
4.5.3
enum類型 140
習題4 144
第2篇 C 面向抽象程序設計
第5單元 繼承 153
5.1 單基繼承 153
5.1.1
公司人員的類層次結構模型 153
5.1.2
C 繼承關系的建立 153
5.1.3
在派生類中重定義基類成員函數 157
5.1.4
基于血緣關系的訪問控制protected 159
5.1.5
類層次結構中構造函數和析構函數的執行順序 160
5.2 類層次中的賦值兼容規則與里氏代換原則 163
5.2.1
類層次中的類型賦值兼容規則 163
5.2.2
里氏代換原則 164
5.2.3
對象的向上轉換和向下轉換 164
5.3 多基繼承 165
5.3.1
C 多基繼承格式 165
5.3.2
計算機系統=軟件 硬件問題的類結構 165
5.3.3
多基繼承的歧義性問題 167
5.3.4
虛擬基類 169
5.4 用虛函數實現動態綁定 170
5.4.1
畫圓、三角形和矩形問題的類結構 170
5.4.2
虛函數與動態綁定 171
5.4.3
虛函數表與虛函數規則 173
5.4.4
override和final 175
5.4.5
純虛函數與抽象類 177
5.5 運行時類型鑒別 179
5.5.1
RTTI概述 179
5.5.2
dynamic_cast 179
5.5.3
type_info類與typeid操作符 185
習題5 188
第6單元 C 程序結構優化 195
6.1 面向對象程序設計的幾個原則 195
6.1.1
引言 195
6.1.2
從可重用說起:合成/聚合優先原則 197
6.1.3
從可維護性說起:開閉原則 199
6.1.4
面向抽象原則 201
6.1.5
單一職責原則 207
6.1.6
接口分離原則 208
6.1.7
不要和陌生人說話 212
6.2
GoF設計模式舉例:工廠模式 214
6.2.1
概述 214
6.2.2
簡單工廠模式 215
6.2.3
工廠方法模式 217
習題6 219
第3篇 C 泛型程序設計
第7單元 模板 223
7.1 算法抽象模板--函數模板 223
7.1.1
從函數重載到函數模板 223
7.1.2
函數模板的實例化與具體化 224
7.2 數據抽象模板--類模板 227
7.2.1
類模板的定義 227
7.2.2
類模板的實例化與具體化 228
7.2.3
類模板的使用 230
7.2.4
類模板實例化時的異常處理 231
7.2.5
實例:MyVector模板類的設計 232
習題7 236
第8單元 STL編程 242
8.1
STL概述 242
8.1.1
容器 242
8.1.2
迭代器 244
8.1.3
容器的成員函數 247
8.1.4
STL算法 250
8.1.5
函數對象 253
8.1.6
STL標準頭文件 255
8.2 撲克游戲vector容器應用實例 256
8.2.1
vector容器的特點 256
8.2.2
撲克游戲對象模型 256
8.2.3
用vector容器對象poker存儲54張撲克牌 257
8.2.4
洗牌函數設計 260
8.2.5
整牌函數設計 263
8.2.6
發牌函數設計 264
8.2.7
vector操作小結 267
8.3
list容器及其應用實例 268
8.3.1
構建list對象及其迭代器 268
8.3.2
操作list對象 269
8.3.3
基于list容器的約瑟夫斯問題求解 273
8.4
string 276
8.4.1
字符串對象的創建與特性描述 277
8.4.2
字符串對象的輸入/輸出 277
8.4.3
字符串的迭代器與字符操作 278
8.4.4
兩個字符串間的操作 282
8.5
stack容器 284
8.5.1
stack及其特點 284
8.5.2
stack的操作 284
8.5.3
應用舉例:將一個十進制整數轉換為K進制數 285
8.6 關聯容器 287
8.6.1
用結構體定義的pair類模板 287
8.6.2
set和multiset容器 289
8.6.3
map和multimap容器 293
8.7 知識鏈接 297
8.7.1
const_iterator 297
8.7.2
分配器 298
習題8 299
第4篇 C 深入編程
第9單元 C 實體訪問探幽 305
9.1
C 實體的基本訪問屬性 305
9.1.1
變量的生命期與C 存儲分配 305
9.1.2
標識符的作用域與鏈接性 307
9.2
C 變量的存儲屬性 309
9.2.1
C 的extern關鍵字 309
9.2.2
C 的static關鍵字 313
9.3
C 名字空間域 320
9.3.1
名字沖突與名字空間 320
9.3.2
名字空間的使用 322
9.3.3
無名名字空間和全局名字空間 324
9.4
const指針與const引用 325
9.4.1
const修飾指針 325
9.4.2
const修飾引用 326
9.4.3
頂層const與底層const 327
9.5
C 11的左值引用與右值引用 329
9.5.1
C 11的左值引用與右值引用的基本概念 329
9.5.2
基于左值和右值概念的表達式分類 330
9.5.3
C 引用的擴展及綁定規則 330
9.5.4
C 11的引用折疊與模板參數推導 333
9.6 智能指針 334
9.6.1
智能指針及其基本原理 334
9.6.2
auto_ptr智能指針 335
9.6.3
Boost庫的智能指針 337
習題9 339
第10單元 C 函數探幽 345
10.1
C 函數調用時的參數匹配規則 345
10.1.1
C 函數調用時的參數匹配規則 345
10.1.2
關于函數實參的計算順序 346
10.1.3
函數名重載 346
10.1.4
形參帶有默認值的函數 349
10.1.5
參數數目可變的函數 350
10.2
參數類型 351
10.2.1
對象參數 351
10.2.2
指針參數 353
10.2.3
數組參數 354
10.2.4
左值引用參數 356
10.2.5
const保護函數參數 359
10.2.6
完美轉發 360
10.3
函數返回 363
10.3.1
函數返回的基本規則 363
10.3.2
函數返回指針 363
10.3.3
函數返回引用 364
10.3.4
const保護函數返回值 367
10.4
移動語義 369
10.4.1
移動語義的提出 369
10.4.2
移動構造函數與移動賦值操作符 369
10.4.3
強制移動與std::move() 371
10.5
Lambda表達式 372
10.5.1
簡單的Lambda表達式 372
10.5.2
在方括號中加入函數對象參數 373
習題10 375
第11單元 C I/O流 379
11.1
流與C 流類 379
11.1.1
流與緩沖區 379
11.1.2
C 流類庫 380
11.1.3
ios類聲明 381
11.2
標準流對象與標準I/O流操作 383
11.2.1
C 標準流對象 383
11.2.2
標準輸入/輸出流操作 383
11.3
流的格式化 383
11.3.1
ios類的格式化成員函數和格式化標志 384
11.3.2
格式化操作符 384
11.4
文件流 385
11.4.1
文件流的概念及其分類 385
11.4.2
文件操作過程 386
11.5
流的錯誤狀態及其處理 389
11.5.1
流的出錯狀態 389
11.5.2
測試與設置出錯狀態位的ios類成員函數 390
習題11 390
附錄A C 保留字 392
A.1
C 關鍵字 392
A.2
C 替代標記 392
A.3
C 庫保留名稱 393
A.4
C 特定字 393
附錄B C 運算符的優先級別和結合方向 394
附錄C C 標準庫與準標準庫 396
C.1
C 標準庫頭文件 396
C.1.1
標準庫中與語言支持功能相關的頭文件 396
C.1.2
支持流輸入/輸出的頭文件 396
C.1.3
與診斷功能相關的頭文件 397
C.1.4
定義工具函數的頭文件 397
C.1.5
支持字符串處理的頭文件 397
C.1.6
定義容器類的模板的頭文件 397
C.1.7
支持迭代器的頭文件 398
C.1.8
有關算法的頭文件 398
C.1.9
有關數值操作的頭文件 398
C.1.10
有關本地化的頭文件 398
C.2
C Boost庫內容 398
C.2.1
字符串和文本處理庫 399
C.2.2
容器庫 399
C.2.3
迭代器庫 399
C.2.4
算法庫 400
C.2.5
函數對象和高階編程庫 400
C.2.6
泛型編程庫 400
C.2.7
模板元編程 400
C.2.8
預處理元編程庫 401
C.2.9
并發編程庫 401
C.2.10
數學和數字庫 401
C.2.11
排錯和測試庫 401
C.2.12
數據結構庫 402
C.2.13
圖像處理庫 402
C.2.14
輸入/輸出庫 402
C.2.15
跨語言混合編程庫 402
C.2.16
內存管理庫 402
C.2.17
解析庫 402
C.2.18
編程接口庫 402
C.2.19
綜合類庫 403
C.2.20
編譯器問題的變通方案庫 403
參考文獻 404
·VII·