關于我們
書單推薦
新書推薦
|
白話C++之練功
《白話C 》分練功和練武兩冊。練功主講編程基礎知識、C 語言語法(含C 11、14等)及多種編程范式。具體包括:大白話講解計算機架構、進程、內存、二進制等編程概念;手把手教復雜編程環(huán)境的安裝應用;快速感受C 語言概貌及圖形界面、數據庫、網絡、多線程等功能庫;深入淺出地講解C 語法、標準庫常用組件及面向過程、基于對象、面向對象、泛型等四種編程范式的演化與對比。
本書借助生活概念幫助用戶理解編程,巧妙安排知識交叉,讓讀者不受限于常見的控制臺下編程,快速感受C 編程的樂趣,提升學習動力。本書適合作為零基礎C 編程學習從入門到深造的課程教材。本書也是《白話C 之練武》的學習基礎。練武的重點內容有:標準庫(STL)、準標庫(boost)、圖形界面庫編程(wxWidgets)、數據庫編程、緩存系統編程、網絡庫編程和多媒體游戲編程等。
作者以講故事的形式展開教學,內容生動有趣,簡單易懂。書中源碼全可下載,方便讀者學習。
(一)
2000年的時候我開始寫《白話C 》。那時候流行個人主頁,就在搜狐網站上申請了一個域名:mywlbcyl,取沒有彎路,編程搖籃的拼音首字母,主要發(fā)表自己寫的C 入門課程。 然后,就走了10多年的彎路,當年要有搖籃里的寶寶跟我學C ,現在都該讀大學了。現實比這更殘酷,跟著我的課程學習的人,當年多數是風華正茂的小鮮肉,現在都成大叔了。就說和我簽訂出書合同的胡編輯,轉眼成了兩個娃的爹。 可我的書還一直在搖籃里。 所以我肯定是一個拖延癥加完美臆想癥的嚴重綜合患者,但我還是想找客觀原因:C 的教程真的好難寫,特別是結合我的想法和目標時。 (二) 十幾年寫一本書,要說是好事也可以。比如這十幾年來,無論是C 還是我,都成熟了好多。 先說C 。新標準的制定與出臺,各家編譯器的進化,越來越多的開源C 項目、基于C 新標準的優(yōu)秀書籍的出現,都是C 長足發(fā)展的標志。還有一點,那就是人,當然我想特指中國人,前面提到的標準、編譯器的實現、開源項目等,都有越來越多的中國C 程序員參與其中。從人的因素出發(fā)很容易又能發(fā)現:C 編程的氛圍也在變好。想當年有一個奇怪的氛圍:說到C 就是VC,說VC就是MFC。2000年前后我曾在某論壇上發(fā)表了有關MFC設計不足之處的一些淺見,立刻淹沒在一大波網友唾棄的口水中,F在,盡管C 早已不是編程語言上的一哥,但受益于多本經典C 書籍的流行,以及發(fā)達的網絡和時間的沉淀,甚至也受益于更多其他編程語言的流行,使用者對這門語言的認識越趨成熟了(相信對其他語言也是)。 再說說我的成長。從二十多歲到四十多歲;從寫幾萬行C 代碼到幾十萬行代碼;從只玩C/C 到在工作中用PHP、Java、C#、Delphi和Python,還學習了D語言、Go語言和JavaScript(Node)等;從嵌入式工控程序到Office桌面軟件;從C/S結構到B/S結構,甚至偶爾充當全棧工程師。大約就是,周一寫JavaScript HTML CSS,周二寫后臺分布式服務,周三改數據庫結構,周四換了一套相對整潔的衣服去拜訪客戶、講PPT,周五人事和我說:幫忙面試個人吧?周末?就像今天一樣,白天補覺,晚上改《白話C 》書稿。 東忙西忙的日子里,我偶爾也回想起大學畢業(yè)剛走上社會的那幾年,覺得自己懂人生、懂社會、也懂編程,現在才發(fā)現這三樣我哪樣都沒能參透。所以我覺得自己應該是成熟了一些,并且覺得幸虧因為拖延癥或者就是懶惰,沒有在10年或更早前寫完本書!栋自扖 》的目的是幫助他人學習C ,而那時我對目標中的幫助他人學習和C 的理解都流于淺顯粗鄙,這樣子寫出來的書對讀者真有幫助嗎? (三) 十數年過去了,中間有近一年的時間,我安排自己到培訓機構兼職教C 編程,非常辛苦也沒什么錢可賺。學習上,我自己買的以C 為主的編程書籍近百本,閱讀網絡下載幾十個開源C/C 項目源代碼;實踐上,我在許多軟件項目中掉進去、爬出來的坑,大大小小感覺像是青春期永不消停的痘,有一天突然全被填平了。不管怎樣,根據一項技能你學習5000(或者更多點,8000)小時就能成為業(yè)界專家的定律,我覺得自己對程序員、對編程技術以及程序員怎么學習和應用編程技術的認識,都上了新的臺階。我慢慢地將這些認識寫進這本書里,一稿、二稿、三稿不斷興奮地寫下,又不斷沮喪地推翻;大家百度白話C ,應該可以找到數個版本。 在反復改寫的過程中,最重要的一個認識是:學習C 應該既練功又練武。沒錯,我把學習C 語言分成練功和練武兩件事。 習武之人說的武功,功通常是身體素質、內氣外力;而武是招式(可以外延到十八般武藝)。關于這二者,有句老話叫練武不練功,到老一場空,意思是光練把式,不練氣力,就容易止于花拳繡腿,一生難成高手。但在另外一個方向上,我記得霍元甲在創(chuàng)建迷蹤拳時曾經說(電視里的):練功不練武,都是白辛苦。說的是另一個極端:你苦練內功,馬步一扎特別穩(wěn)實,卻什么拳法招式都不練,什么兵器也不學,就會變成空有一身力氣使不出來,白辛苦。轉了個笑話加深大家對這種尷尬局面的理解,說是一個練鐵布衫的和一個練金鐘罩的比武,兩人都一動不動地呈現入定狀態(tài),裁判在邊上哭著說,你倆扛得住,我扛不住。 那么編程行業(yè)中,什么是功呢?廣義上講,計算機原理、網絡協議、算法、語言語法、編譯原理、設計模式都可以歸為功。而類似如何創(chuàng)建一個窗口如何提交一個網頁的表單網頁局部刷新的AJAX技術怎么用某某語言解析XML用哪個類怎么實現JSON和對象的互換如何訪問MySQL數據庫如何在數據鏈路上加入緩存哪家的短信服務器好用又便宜安卓系統如何實現消息推送以及Linux下的進程掛掉時怎么快速重啟等這些問題的答案,統統是武。 再進一步限定范圍到編程新人如何學習C ,我將功限定在C 語言語法和編程范式(面向過程、基于對象、面向對象、泛型編程)等基礎知識上,但凡對C 有一定了解的人,都清楚這已經可以寫成厚厚的一本書了。以語言為主要教學內容的《C Primer》或《C 程序設計語言》的厚度便是佐證。武的方面則挑選來自標準庫STL及準標準庫boost中的常用工具,桌面GUI編程、并發(fā)編程、數據庫(MySQL)訪問、緩存(Redis)訪問、網絡編程以及僅限于自娛自樂的簡單多媒體游戲編程等。 武強功弱的C 工程師,通常解決實際問題的能力還不弱。項目要用到網絡,就找個網絡框架照著搭起來;項目要用到視頻處理就找些視頻代碼改改用。C 語言的特點是一方面很復雜很龐大,一方面只需學習一小部分(比如帶類的C語言)就可以寫程序,甚至可以一招鮮、走遍天。這就造成部分人在學習階段就急于動手出成績甚至上崗賺錢。如此情況下,當他們面對復雜問題時,往往采用堆砌代碼等方式完成,一個人做到底看似很快,想要在團隊分工中讓別人看懂他的代碼就很困難了。并且所寫的代碼往往缺少合理的設計,在需求變化幾次之后,整個代碼就膨脹得像生氣的河豚。 再說說那些練功不練武,都是白辛苦的同學。C 語言還有個特點,就是它的標準庫僅為有高度共性、高度抽象的邏輯提供功能,許多實際項目經常用到的業(yè)務功能統統沒有。想象丁小明(本書中的重要人物)捧了一本厚厚的C 書籍辛苦學了一年,上班時才發(fā)現老板是這么要求的:聽說QQ是C 寫的,你來寫個類似的窗口。聽說C 寫的程序性能好,你寫個網絡服務端,要求不高,1秒鐘撐1萬次訪問就好。聽說游戲引擎基本是C 寫的,你開發(fā)個萬人在線游戲吧。聽說Photoshop也是C 寫的,你寫個程序批量美化下公司年會上的照片吧。難嗎?不好說,只是丁小明清楚地記得學習所用的那本C 書籍快1 000頁了,但從頭到尾沒出現過網絡、窗口創(chuàng)建、游戲和圖片處理等。丁小明很郁悶。 本書是《白話C 》上冊,重點負責功的部分。講C 基本語法也講二進制,講編程環(huán)境如何搭建也講面向過程基于過程和面向對象等編程范式,等等。下冊負責武,講解如何用C 寫窗口圖形界面程序、多線程并發(fā)程序、網絡通信程序、數據庫程序和小游戲程序等具體技能。 (四) 關于如何學習C ,我的第二個認識是:你沒辦法學一遍就能精通C 。事實上學習再多遍恐怕也精通不了,但請相信:剛開始學習時,通讀一遍,練習一遍,再回頭重新學習一遍,會比一節(jié)節(jié)死摳過去,結果一年時間未能讀完一冊的效果要好。C 中有許多知識點是交叉的,比如指針和數組,指針可以指向數組,數組的元素可以是指針,數組作為函數入參時會退化成指針。因此二者誰放前誰放后都有合理之處,學習完前面的有利于學習后面的,但學習了后面的同樣有利于進一步理解前面的。拉長鏡頭看《白話C 》,許多篇章之間,甚至跨越上下冊之間,都存在后面內容對前面內容進行驗證或補充的安排。另一方面,許多復雜的知識,在靠前的章節(jié)就簡略提及,這是刻意地對知識點做交叉學習的安排。最典型的如下冊中的許多內容,在上冊一開始就會有不求甚解的快速涉獵,讓學習者感受C 的能量,避免一直埋頭在黑乎乎的控制臺窗口,誤以為自己只能用C 寫一些玩具代碼。 以30天背30個英語單詞為例,若一天就背30個,連續(xù)背30天;其效果通常要比第一天背第1個,第二天背第2個,一直背到第30個要好。機械記憶尚且如此,更何況是充滿有機關聯的編程語言呢? 作為一個極端的反例,學習編程語言一定不要過早追求100%精確,更不要沉迷于當語言律師。網上流傳一個小視頻,說是一位幼兒園老師想教會小朋友關于小鳥聽到槍聲會受驚嚇飛走的知識,于是設計了一個問題:樹上停著七只鳥,獵人打了一槍后,樹上剩下幾只鳥?沒想到所有小朋友都很冷靜,第一個問:有沒有耳聾的鳥?第二個問:有沒有膽子大、神經大條的鳥?第三個問:有沒有哪只鳥和死去的那只鳥的感情深厚,堅決要留下殉情的?好嘛,為了回答老師那個看似簡單的問題,這一下涉及到生理、心理和鳥類感情等方方面面的知識,這樣的教學還如何進行呢? 《白話C 》第一章為讀者圈出學習的最低起點,書的課程以該起點逐步推演。因此,許多知識點會反復出現,而且在不同的出現階段會有不同的解釋?亢蟮慕忉屜鄬θ妗⒁(guī)范、簡潔、深刻;靠前的解釋就難免片面、粗淺、啰嗦甚至牽強很可能低于您已有的水平,此時請各位一笑而過。 當然,以上有關不求甚解的說法,并非鼓勵大家蜻蜓點水、囫圇吞棗般地學習。正確的方法應當是:遇上問題,加以思考;一時思考不出答案,應善于上網搜索;勤于編寫程序測試或驗證結果以及與人交流請教;如果還是不能解疑,也沒必要卡在原地,可以做上標記,繼續(xù)往下學習。 (五) 書中除了普通正文之外,還設置了課堂作業(yè)小提示重要危險和輕松一刻等小段落。各自的作用和學習的要點如下: 課程作業(yè):一定要現場做,所謂現場就是不往后看新內容,立馬做。出于排版需求,有一些作業(yè)并未單獨成段,而是直接寫在普通段落中。另外,更為重要的是,只要課程中出現示例代碼,基本上要求讀者親自動手寫程序并編譯、測試通過。 小提示:和當前課程內容有一定的相關性,用于輔助解釋當前課程的部分內容。碰上時能看懂最好,但如果個別無法理解也不用放在心上,通常并不影響繼續(xù)閱讀后文。 重要:長遠看都是重要的知識點,雖然現在一時讀不懂不會影響繼續(xù)學習,但長遠看會影響關鍵知識的運用。因此應努力閱讀,如果不懂應做標記,以期下一次閱讀能理解、掌握。 危險:如果現在搞不懂,很可能往下(特別是需要寫代碼時)沒多長時間就要出問題的知識點。 輕松一刻:主要用于調節(jié)學習氛圍,讓大家偶爾放松,但也存在部分內容同時發(fā)揮小提示的作用,可當成相對有趣的小提示來看。當然出于行文的需要,也有大量輕松一刻的內容會以更加一本正經的方式躲在正文中。 (六) 希望《白話C 》能幫到正在或正要學習C 的廣大讀者。感謝購買本書。限于個人能力,加上篇幅大,前后反復修改大,請讀者多提寶貴意見,以期持續(xù)改進。 感謝一直信任我,也一直在為本書努力的編輯。 感謝我的父母。未能在我的父親離世之前完稿,是我今生至憾。感謝我的妻女,是你們一直在鞭策和鼓勵我。我一直以為《白話C 》會是我的二女兒,可是書還沒面市,家里二寶出生了,都上幼兒園了,這書要屈居老三。 幫助我完成本書的還有我的同事、朋友、同行、老師以及學生,一并感謝。以下是致謝名單:涂祺招、劉弘釗、胡海、王嫣琪、盧淼先、吳宸勖、顏閩輝、肖華、林起柄、揭英杰、陳婷婷、張曉曉、陳曉鋒、白偉能、林柏年、盧毅、楊文、羅海翔、莊淵、賴錦波、潘代淦。 請在北京航空航天大學出版社官網的下載專區(qū)或者在第2學堂網下載本書源碼。
莊嚴,筆名南郁;20年IT從業(yè)經歷,從一線研發(fā)人員到企業(yè)副總工、技術總監(jiān)。雖然不同崗位有不同職責,但從未放棄過編程。編寫過嵌入式、字處理軟件、語言解釋器、手機應用、大型分布式網絡服務和互聯網商城等軟件系統。
現為程知信息公司創(chuàng)始人,致力于將自身的技術、學習過程、成長歷程、對內對外的技術培訓、大學院校培訓課程以及常年參與技術員面試的心得體會、經驗教訓形成相關課程。
第1章啟蒙1
1.1開始1 1.2什么是計算機4 1.2.1馮·諾依曼版4 1.2.2白話 C 版5 1.3什么是硬件、軟件6 1.4什么是程序7 1.4.1什么是指令7 1.4.2指令兼容8 1.4.3程序=指令的邏輯組合8 1.4.4程序vs軟件9 1.5什么是編程語言9 1.5.1機器語言10 1.5.2機器語言的字母10 1.5.3二進制(基礎)11 1.5.4匯編語言11 1.5.5高級語言12 1.5.6編程思維13 1.5.7從C到C 14 1.6什么是IDE15 1.7你是程序員17 1.8出發(fā)贈言19 第2章準備20 2.1基礎知識20 2.1.1開源協議20 2.1.2庫是什么20 2.1.3庫長什么樣子21 2.1.4學習哪些庫22 2.1.5準備安裝目錄22 2.1.6更多支持22 2.2安裝IDECode::Blocks23 2.2.1檢查MinGW環(huán)境23 2.2.2安裝Code::Blocks23 2.2.3升級Code::Blocks24 2.2.4安裝MinGWw6424 2.2.5試運行25 2.2.6配置IDE26 2.3系統編譯環(huán)境變量29 2.4安裝wxWidgets30 2.4.1下載31 2.4.2編譯31 2.4.3檢查32 2.5安裝boost33 2.5.1下載33 2.5.2輔助工具34 2.5.3編譯34 2.5.4檢查35 2.6安裝MySQL35 2.6.1搞清楚位數36 2.6.2安裝MySQL37 2.6.3安裝MySQL管理客戶端38 2.6.4安裝MySQL 32位C語言客戶端庫39 2.7安裝MySQL 39 2.7.1輔助工具39 2.7.2下載39 2.7.3編譯39 2.7.4安裝40 2.8配置Code::Blocks全局變量41 2.8.1新建全局變量集:d2school42 2.8.2全局路徑變量wx42 2.8.3全局路徑變量boost43 2.8.4全局路徑變量mysql44 2.8.5全局路徑變量mysqlpp44 第3章感受(一)45 3.1Hello world經典版45 3.1.1向導控制臺項目45 3.1.2初識代碼47 3.1.3頭文件48 3.1.4標準輸出cout50 3.1.5名字空間51 3.1.6函數52 3.1.7主函數54 3.1.8注釋55 3.2Hello world中文版56 3.2.1字符集和編碼56 3.2.2問題與解決56 3.3Hello world函數版58 3.3.1定義函數58 3.3.2調用函數58 3.3.3重復調用59 3.3.4帶參函數59 3.4Hello world交互版61 3.4.1變量61 3.4.2常量63 3.4.3數據類型63 3.4.4定義變量64 3.4.5完成交互64 3.5Hello world分支版65 3.5.1流程控制ifelse66 3.5.2修改Hello函數區(qū)別對待66 3.5.3多級ifelse67 3.5.4常見關系、邏輯操作符67 3.6Hello world循環(huán)版68 3.6.1流程控制while68 3.6.2修改main函數反復操作69 3.7Hello Object生死版70 3.7.1定義對象類型71 3.7.2創(chuàng)建對象72 3.7.3構造函數73 3.7.4析構函數74 3.7.5對象生命周期74 3.7.6對象與內存78 3.7.7對象可見區(qū)域80 3.8Hello Object成員版81 3.8.1成員數據84 3.8.2成員函數85 3.9Hello Object派生版86 3.9.1使用分支86 3.9.2為何派生87 3.9.3如何派生88 3.9.4定義美人類88 3.9.5使用美人類89 3.9.6變和不變89 3.9.7派生類的生死過程90 3.10Hello Object多態(tài)版92 3.10.1虛函數93 3.10.2虛析構函數95 3.10.3應用虛函數96 3.10.4多態(tài)vs.非多態(tài)99 3.11Hello Object封裝版99 3.11.1什么是封裝99 3.11.2類型即封裝101 3.11.3公開、保護、私有102 3.11.4class vs struct104 3.11.5封裝應用示例105 3.11.6常量成員函數109 3.12Hello STL向量篇110 3.12.1基礎111 3.12.2常用接口112 3.12.3遍歷113 3.12.4實例:選美大賽管理系統115 3.13Hello STL鏈表篇123 3.13.1基礎124 3.13.2迭代器/iterator概念124 3.13.3常用函數1126 3.13.4常用函數2128 3.13.5常量迭代器130 3.13.6遍歷list容器131 3.13.7實例:成績管理系統1132 3.14Hello STL算法篇137 3.14.1函數對象139 3.14.2自定義查找算法141 3.14.3泛化查找算法143 3.14.4標準庫查找算法146 3.14.5標準庫排序算法147 3.14.6實例:成績管理系統2148 3.15Hello STL文件篇160 3.15.1寫文件161 3.15.2讀文件163 3.15.3帶格式讀取164 3.15.4實例:成績管理系統3165 第4章感受(二)170 4.1Hello GUI基礎篇170 4.1.1C::B文件默認編碼170 4.1.2wxWidgets項目向導171 4.1.3界面設計172 4.1.4編譯運行174 4.1.5發(fā)布程序174 4.2Hello GUI布局篇175 4.2.1wxSmith基礎175 4.2.2wxBoxSizer基礎179 4.2.3布局修改實例180 4.2.4掛接事件183 4.3Hello Internet184 4.3.1創(chuàng)建項目185 4.3.2界面設計185 4.3.3編寫代碼186 4.4Hello Database188 4.4.1基本需求189 4.4.2準備數據189 4.4.3創(chuàng)建工程190 4.4.4編寫代碼192 第5章基礎198 5.1從代碼到程序198 5.1.1編譯機制198 5.1.2解釋機制200 5.1.3虛擬機機制201 5.2構建C 程序202 5.2.1預編譯202 5.2.2編譯205 5.2.3鏈接206 5.2.4手工構建208 5.3項目/Project209 5.3.1項目文件209 5.3.2源文件、頭文件210 5.3.3使用頭文件211 5.3.4庫文件215 5.4進程與內存216 5.4.1什么叫進程217 5.4.2進程的內存空間217 5.4.3內存分配測試程序218 5.5內存分段220 5.5.1代碼段221 5.5.2數據段和全局數據221 5.5.3棧內存223 5.5.4堆內存224 5.6CPU、寄存器225 5.7線程227 5.8數據與內存230 5.8.1地址、尺寸、值、類型230 5.8.2取址、取尺寸、取值、取類型233 5.8.3指針裝著地址的變量235 5.8.4堆數據與內存237 5.8.5數組數據239 5.8.6堆數組與內存240 5.8.7常量與內存245 5.8.8二維數組與內存247 5.8.9數組綜合練習248 5.8.10聲明、定義、實現251 5.9進制(一)258 5.9.1初識二進制258 5.9.2正整數和零259 5.9.3負整數(原碼、反碼、補碼)259 5.9.4無符號數vs有符號數262 5.10進制(二)263 5.10.1十六進制263 5.10.2八進制265 5.10.3進制換算266 5.10.4浮點數267 第6章IDECode::Blocks271 6.1窗口布局271 6.1.1邊欄271 6.1.2工具欄272 6.1.3布局保存273 6.2環(huán)境設置273 6.2.1常規(guī)設置/General Settings273 6.2.2視圖/View274 6.2.3多頁面板/Notebooks appearance274 6.2.4禁用的對話框/Disabled dialogs275 6.2.5內置游戲/C::B Games275 6.2.6自動保存/Autosave275 6.2.7環(huán)境變量/Environment variables276 6.2.8頭文件自動引入/HeaderFixup configuration276 6.2.9幫助文件/Help files277 6.2.10待辦事件/Todo list278 6.3編輯器設置279 6.3.1常規(guī)設置/General Settings279 6.3.2代碼折疊/Folding282 6.3.3邊界和光標符/Margins and caret282 6.3.4語法高亮/Syntax highlighting282 6.3.5簡寫詞/Abbreviations282 6.3.6代碼格式化工具/Source formatter283 6.3.7代碼完成/Code completion284 6.3.8快捷鍵/Keyboard shortcuts284 6.3.9拼寫檢查/Spell Checker287 6.3.10wxSmith配置287 6.4編譯器全局設置287 6.4.1編譯器選項/Compiler settings288 6.4.2其他設置/Other settings288 6.4.3構建配置/Build options288 6.5調試器全局設置288 6.6全局路徑變量289 6.7項目管理290 6.7.1項目組織290 6.7.2項目向導292 6.7.3項目文件293 6.8項目構建選項294 6.8.1公共配置和目標配置294 6.8.2項目編譯器設置/Compiler Settings295 6.8.3項目鏈接器設置/Linker settings296 6.8.4項目搜索路徑/Search directories298 6.8.5項目構建附加步驟/Prepost build steps300 6.8.6項目定制變量/Custom variables300 6.9項目屬性300 6.9.1項目設置/Project settings300 6.9.2構建目標/Build targets301 6.10項目實踐303 6.10.1構建動態(tài)庫303 6.10.2構建靜態(tài)庫304 6.10.3主項目可執(zhí)行程序305 6.10.4配置依賴庫305 6.10.5設置項目間依賴關系306 6.11調試307 6.11.1啟動調試307 6.11.2設置斷點308 6.11.3單步運行309 6.11.4觀察數據309 6.11.5單步進入310 6.11.6單步跳出311 6.11.7其他步進指令311 6.11.8定位錯誤311 6.11.9中止調試312 第7章語言313 7.1字面量313 7.1.1整數字面量314 7.1.2浮點數字面量315 7.1.3空指針字面量315 7.1.4布爾值字面量316 7.1.5字符字面量317 7.1.6字符串字面量322 7.1.7枚舉字面量323 7.1.8宏替換325 7.1.9自定義字面量326 7.2類型327 7.2.1基本概念327 7.2.2整型329 7.2.3浮點型330 7.2.4字符類型331 7.2.5布爾類型332 7.2.6空類型333 7.2.7類/結構334 7.2.8枚舉類型338 7.2.9類型別名344 7.3類型基礎行為345 7.3.1定義345 7.3.2初始化行為348 7.3.3初始化類成員356 7.3.4復制構造行為361 7.3.5賦值行為366 7.3.6轉換行為371 7.3.7轉移行為380 7.3.8析構行為384 7.4變量和常量385 7.4.1變或不變385 7.4.2常量成員數據386 7.4.3常量成員函數387 7.5引用388 7.5.1定義引用390 7.5.2常量引用392 7.5.3引用傳遞393 7.5.4右值引用395 7.6指針401 7.6.1定義指針401 7.6.2初始化指針401 7.6.3取值與成員訪問403 7.6.4釋放指針404 7.6.5常量指針406 7.6.6指針的指針408 7.7數組409 7.7.1初始化數組410 7.7.2常量數組410 7.7.3數組間復制數據411 7.7.4數組退化411 7.7.5字符數組和字符串413 7.7.6多維數組415 7.7.7指針和數組417 7.7.8數組類型的別名420 7.8STL常用類型420 7.8.1std::string/wstring422 7.8.2std::list424 7.8.3std::vector426 7.8.4std::array430 7.8.5std::map433 7.8.6std::ofstream437 7.8.7std::ifstream439 7.8.8std::stringstream441 7.8.9智能指針442 7.9生存期、作用域、可見性、訪問限定451 7.9.1基本概念451 7.9.2聲明453 7.9.3名字空間455 7.9.4類型定義作用域469 7.10函數477 7.10.1函數作用域477 7.10.2自由函數、成員函數478 7.10.3函數聲明與定義478 7.10.4函數入參479 7.10.5函數返回值489 7.10.6函數靜態(tài)數據503 7.10.7遞歸調用504 7.10.8函數重載505 7.10.9操作符重載509 7.10.10內聯函數512 7.10.11主函數514 7.10.12函數指針515 7.11Lambda函數519 7.11.1基本概念519 7.11.2入參與返回522 7.11.3捕獲/capture523 7.12操作符與表達式527 7.12.1算術操作528 7.12.2基礎操作529 7.12.3關系操作530 7.12.4邏輯操作531 7.12.5位操作533 7.12.6自運算536 7.12.7逗號操作符538 7.12.8取址、取值539 7.12.9成員訪問540 7.12.10指針偏移計算540 7.12.11數組運算543 7.13語句與流程544 7.13.1簡單語句544 7.13.2復合語句544 7.13.3if545 7.13.4switch549 7.13.5while553 7.13.6dowhile556 7.13.7for562 7.13.8break/continue567 7.13.9goto569 7.13.10綜合練習570 7.14模板580 7.14.1基本概念580 7.14.2函數模板581 7.14.3顯式指定模板參數582 7.14.4函數模板示例583 7.14.5類模板585 7.14.6成員函數模板587 7.14.7標準庫函數模板示例588 7.14.8模板代碼編譯591 7.15異常593 7.15.1斧頭幫的異常594 7.15.2錯誤VS異常594 7.15.3基本語法599 7.15.4示例:斧頭幫行動異常版601 7.15.5異常再拋出603 7.15.6捕獲任意類型異常606 7.15.7函數異常規(guī)格607 7.15.8函數自我捕獲異常608 7.15.9構建異常家族610 7.15.10標準庫異常類613 7.16并行流程615 7.16.1多線程615 7.16.2線程同步互斥體619 7.16.3規(guī)避死鎖622 7.16.4使用守護鎖623 7.16.5實例:并行累加5千萬個數624 第8章面向對象634 8.1抽象634 8.1.1概念635 8.1.2難點637 8.1.3要素639 8.2封裝643 8.2.1不變式645 8.2.2原則647 8.2.3不變式實例649 8.2.4從關系到狀態(tài)655 8.2.5類型即封裝656 8.2.6類型默認行為658 8.2.7this指針660 8.2.8訪問控制664 8.2.9冗余保護664 8.2.10構造與資源初始化666 8.2.11析構與資源釋放673 8.2.12復制行為定制675 8.2.13特定行為定制680 8.2.14定制類型轉換686 8.2.15轉移操作689 8.2.16靜態(tài)成員689 8.2.17常量成員693 8.2.18嵌套類694 8.2.19友元696 8.2.20回歸C的封裝702 8.2.21進階思考709 8.3派生735 8.3.1語法基礎738 8.3.2受保護的741 8.3.3派生方式744 8.3.4派生類的構造746 8.3.5派生類的析構750 8.3.6多重派生751 8.3.7派生類與作用域755 8.4基于對象例程759 8.4.1INI文件簡介760 8.4.2面向過程的設計761 8.4.3基于對象的設計767 8.4.4復用實現的派生775 8.5多態(tài)779 8.5.1什么和為什么779 8.5.2接口約定782 8.5.3虛函數785 8.5.4多態(tài)實例786 8.6OO設計原則792 8.6.1isa關系792 8.6.2抽象、抽象、再抽象795 8.6.3高內聚低耦合797 8.6.4明確數據邊界800 8.6.5強化數據不變性803 8.6.6層次與模塊808 8.6.7框架型基類809 8.7綜合練習815 8.7.1工資發(fā)放練習815 8.7.2射擊游戲的需求815 8.7.3小小進銷存的需求817 第9章泛型820 9.1泛型概念820 9.2基礎回顧820 9.2.1函數模板820 9.2.2類模板822 9.2.3成員函數模板823 9.3模板實例化825 9.3.1只幫一次忙825 9.3.2潛在匹配條件828 9.3.3顯式指定類型829 9.3.4類模板實例化831 9.3.5模板內符號身份確定832 9.3.6非類型模板參數835 9.3.7模板參數默認值838 9.4泛型應用實例838 9.4.1CStyle類型轉換模板838 9.4.2Pair839 9.4.3AutoPtr842 9.4.4RangeArray849 9.4.5鏈表結構856 9.5泛型特化872 9.5.1函數模板特化872 9.5.2類模板特化基礎876 9.5.3局部特化的花樣878 9.5.4全特化880 參考文獻881
你還可能感興趣
我要評論
|