[備忘]《C++入門經典》各章小節

《C++入門經典》(即英文版「Beginning C++ The Complete Language」的中譯版)

各章小節算法

 

第1章 基本概念編程

·C++中的程序至少包含一個main()函數。數組

·函數的可執行部分由包含在一對花括號中的語句組成。函數

·一對花括號定義了一個語句塊。測試

·在C++中,語句用分號結束。this

·關鍵字是C++中有特殊含義的一組保留字。程序中的實體不能與C++語言中的任何關鍵字同名。指針

·C++程序包含在一個或多個文件中。調試

·定義函數的代碼一般存儲在擴展名爲.cpp的文件中。對象

·定義數據類型的代碼一般存儲在擴展名爲.h的頭文件中。繼承

·標準庫提供了支持和擴展C++語言的大量功能。

·C++中的輸入和輸出是利用流來執行的,而且須要使用插入和提取運算符,即<<和>>。

·面向對象的編程方式須要定義專用於某程序的新數據類型。一旦定義好須要的數據類型,就能夠根據這些新數據類型來編寫程序。

 

 

第2章 基本數據類型和計算

·數值和字符常量稱爲字面量。

·能夠把整數字面量定義爲十進制、十六進制或八進制。

·浮點字面量必須包含小數點或指數,或二者都包含。

·C++中的已命名對象,例如變量,其名稱能夠包含一組字母和數字,但第一個字符必須是字母,下劃線也看做是字母。大小定字母是不一樣的,所以變量是區分大小寫的。

·因爲如下劃線開頭後跟一個大寫字母的名稱,以及包含兩個連續下劃線的名稱,是標準庫中使用的保留名稱,所以它們不該用做變量名。

·C++中的全部字面量和變量都有給定的類型。

·能夠存儲整數的基本類型有short、int和long。它們在默認狀況下存儲帶符號的整數,也可使用類型修飾符unsigned來限定這些類型。

·char類型的變量能夠存儲單個字符。char類型在默認狀況下能夠是帶符號的,也能夠是不帶符號的,這取決於編譯器。也可使用signed char和unsigned char類型的變量存儲整數。

·浮點數的數據類型有float、double和long double。

·變量的名稱和類型出如今聲明語句中,以一個分號結束。聲明一個變量,若是給該變量分配了內存空間,那麼也就定義了該變量。

·變量在聲明時能夠指定初始值,這是一種很好的編程習慣。

·能夠用修飾符const保護基本類型的「變量」值。編譯器會在程序源代碼文件中檢查是否試圖修改聲明爲const的變量。

·lvalue是出如今等號左邊的一個對象或表達式,非const的變量就是lvalue。

 

 

第3章 處理基本數據類型

·能夠在表達式中混合使用不一樣類型的變量和常量。編譯器會在須要時,自動把變量轉換爲相應的類型。

·當等號右邊的類型與等號左邊的類型不一樣時,也能夠把等號右邊的類型自動轉換爲等號左邊的類型。當左邊的類型不能徹底包含與右邊類型的信息相同的信息時,就可能丟失信息。例如把double轉換爲int或把long轉換爲short。

·使用static_cast<>(),能夠把一種基本類型的值轉換爲另外一種基本類型。

·在默認狀況下,在一個塊中聲明的變量是自動變量,也就是說,它在聲明它的那行代碼處開始存在,到包含其聲明的塊的結尾處消失。塊尾用右花括號表示。

·變量能夠聲明爲靜態,此時該變量存在於程序的整個生成周期。可是,它只能在定義的做用域中訪問。若是沒有顯示初始化靜態變量,它就會默認初始化爲0。

·在程序中,變量能夠在全部塊的外部聲明,此時該變量具備全局命名空間做用域,在默認狀況下具備靜態的存儲持續時間。在包含它們的程序文件中,具備 全局做用域的變量能夠在聲明它以後的任何位置被訪問,除了存在一個與該全局變量同名的局部變量以外。即便如此,全局變量仍可使用做用域解析運算符 (::)訪問。

·關鍵字typedef容許定義其餘類型的同義詞。

·extern關鍵字容許引用在另外一個文件中定義的全局變量。

 

 

第4章 選擇與決策

·可使用比較運算符比較兩個值,獲得一個bool類型的值,它能夠是true或false。

·能夠把bool值強制轉換爲整數類型——true強制轉換爲1,false強制轉換爲0。

·能夠把數值強制轉換爲bool類型——0強制轉換爲false,非0值強制轉換爲true。

·if語句能夠根據條件表達式的值執行一個語句或語句塊。若是條件是true或非0值,就執行語句或語句塊。若是條件是false,或0,就不執行。

·if-else語句給簡單的if語句提供了另外一個選項。若是條件爲false或0,就執行else語句。

·if和if-else語句能夠嵌套。

·cctype頭文件提供了標準庫函數的聲明,這些函數能夠爲字符分類,把字母轉換爲大寫或小寫形式。cwctype頭文件提供了這些函數的多字節字符版本的聲明。

·switch語句能夠根據整數表達式的值,從一組固定的選項中選擇。

·條件去處符根據一個表達式的值,選擇兩個值中的一個。

·使用goto語句,能夠無條件地分支帶有指定標籤的語句。

 

 

第5章 循環

·循環是重複執行一組語句塊的機制。

·有3種循環:while循環、do-while循環和for循環。

·只要指定的條件爲true,就重複執行while循環。

·do-while循環至少執行一次,只要指定的條件爲true,就繼續執行該循環。

·for循環一般用於重複指定的次數,它有3個控制表達式。第一個是初始化表達式,僅在循環的開始執行一次。第二個是循環條件,在每次迭代以前執行,它必須爲true,循環纔會繼續。第三個控制表達式在每次迭代結束時執行,一般用於遞增循環計數器。

·任何類型的循環均可以嵌套在其它類型的循環當中,嵌套次數不限。

·在循環中執行continue語句會跳過當前迭代的剩餘語句,若是循環控制條件容許,就直接開始下一次迭代。

·在循環中執行break語句會當即退出循環。

·循環定義了一個做用域,在循環中聲明的變量不能在該循環外部訪問。特別是,在for循環的初始化表達式中聲明的變量不能在循環外部訪問。

 

 

第6章 數組和字符串

·數組是同一類型的數值的命名集合,它們存儲在連續的內存塊中,每一個值均可以經過一個或多個索引值來訪問。

·一維數組須要一個索引值來引用其元素,二維數組須要兩個索引值,n維數組須要n個索引值。

·數組的元素能夠用在等號的左邊和表達式中,其方法與相同類型的變量同樣。

·char類型的一維數組能夠用於存儲非空字符串。

·可讓編譯器根據聲明語句中初始化值的個數,來決定數組中最左邊一維的大小。

·能夠把char類型的二維數組用做非空字符串的一維數組。

·string類型存儲了一個字符串,它不須要終止字符。

·在string變量名後面的方括號中指定索引值,就能夠訪問string對象中的各個字符。索引值從0開始。

·string類型的對象能夠利用函數來搜索、修改和提取子字符串。

·聲明string類型的數組與聲明其餘類型的數組所採用的方法是同樣的。

 

 

第7章 指針

·指針是包含地址的變量。

·使用地址運算符&能夠獲取變量的地址。

·要引用指針指向的值,應使用間接運算符*。它也稱爲解除引用運算符。

·能夠對存儲在指針中的地址加減整數值。其結果就像指針引用一個數組同樣,指針會變爲整數值所指定的數組元素的個數。

·運算符new會分配自由存儲區中的一塊內存,返回所分配的內存地址,使它可在程序中使用。

·運算符delete能夠釋放用運算符new分配的內存塊。

·reinterpret_cast<>()運算符能夠把一種類型的指針轉換爲另外一種類型。

 

 

第8章 使用函數編程

·函數是一個自包含的代碼單元,它有着已定義好的目的。通常的程序問題包含大量的小函數,而不是包含幾個大函數。

·函數定義包含定義了參數和返回類型的函數頭,以及包含函數的可執行代碼的函數體。

·函數原型容許編譯器處理對該函數的調用,但此時函數定義可能尚未處理。

·因爲給函數傳送參數的按值傳送機制,是傳送原參數值的副本,所以原參數值不能在函數中訪問。

·給函數傳送指針能夠修改該指針所指向的值,但指針自己是按值傳送。

·把指針參數聲明爲const能夠防止修改原來的值。

·爲函數的參數指定默認值後,只要參數有默認值,就容許有選擇地省略參數。

·從函數中返回引用,容許在等號運算符的左邊使用該函數。把返回類型聲明爲const引用,能夠阻止在等號運算符的左邊使用該函數。

 

 

第9章 函數

·重載函數是名稱相同、但參數列表不一樣的函數。重載函數不能僅經過返回類型來區分。

·函數簽名由函數名和指定的參數個數及類型來肯定。在調用重載函數時,編譯器會檢查函數簽名,把它與可用的函數做比較,而後選擇合適的函數。

·函數模板是自動生成重載函數的一種方法。

·函數模板有一個或多個參數,這些參數一般是類型變量,也能夠是非類型的變量。函數模板的實例,即函數定義,由編譯器爲每一個對應於一組惟一模板參數的函數調用建立的。

·函數模板能夠用其餘函數或函數模板來重載。

·函數指針存儲了函數的地址,以及參數的類型和個數、返回類型等信息。

·可使用函數指針來存儲有對應返回類型、參數類型和個數的任一函數地址。

·可使用函數指針來調用它包含的地址上的函數,還能夠把函數指針做爲函數參數來傳送。

·遞歸函數是調用它自身的函數。採用遞歸方式實現算法有時能夠獲得很是簡明的代碼,但與實現同一算法的其餘方法相比,採用遞歸方式經常須要更多的執行時間。

 

 

第10章 程序文件和預處理器

·頭文件包含聲明、沒有生成可執行指令的其餘代碼,以及內聯函數定義。按照約定,頭文件使用擴展名.h。

·把函數定義和邏輯變量放在源文件中,源文件的擴展名是.cpp。

·包含所需聲明的頭文件的內容應經過#include指令,插入到.cpp文件中。

·.cpp文件構成了一個轉化單元,編譯器把轉化單元做爲一個單元來處理,以生成對象文件。

·命名空間定義了一個做用域——在這個做用域內聲明的全部名稱都附加了命名空間的名稱。不在顯式命名空間做用域內聲明的名稱就在全局命名空間中。

·一個命名空間能夠由幾個獨立的同名命名空間聲明組成。

·在不一樣的命名空間中聲明的相同名稱是不一樣的。

·爲了在命名空間的外部引用在命名空間中聲明的標識符,須要指定命名空間的名稱和標識符,二者之間用做用域解析運算符::分隔開。

·在某個命名空間中聲明的名稱,在這個命名空間中使用時,能夠不加限定符。

·預處理器執行預處理器指令,在編譯代碼以前傳送轉化單元中的源代碼。處理完全部的指令後,轉化單元就只能包含C++代碼,沒有預處理器指令了。

·可使用條件預處理器指令,確保頭文件的內容在一個轉化單元中沒有重複。

·可使用條件預處理器指令,控制是否在程序中包含跟蹤或其餘診斷調試代碼。

·assert()宏容許在執行過程當中測試邏輯條件,若是邏輯條件爲假,就輸出一個消息,並終止程序。

 

 

第11章 建立本身的數據類型

·結構類型是程序中的一個新數據類型。

·結構對象是帶有成員的對象,這些成員在默認狀況下可公開訪問。結構能夠有數據成員和函數成員。

·可使用對象名和句點分隔的成員名來引用結構對象的成員。其中句點稱爲成員選擇運算符。

·聯合是一種數據類型,它的對象可使用同一個內存塊在不一樣的時刻存儲幾種不一樣變量的值(也許類型也不一樣)。

·在聲明聯合對象時,只能爲聯合的第一個成員提供對應類型的初始值。

·結構的數據成員能夠是任意類型,包括其餘結構,但數據成員的類型不能與包含它的結構的類型相同。

·不須要構造函數來建立的結構對象叫作聚合;聚合的成員能夠用花括號中的初始值列表來初始化。

 

 

第12章 類

·類提供了定義本身的數據類型的一種方式。類能夠反映某個問題所須要的對象類型。

·類能夠包含數據成員和成員函數。類的成員函數老是能夠自由訪問該類中的數據成員。

·類的對象用構造函數來建立和初始化。在聲明對象時,會自動調用構造函數。

·構造函數能夠重載,以提供初始化對象的不一樣方式。

·類的成員能夠指定爲public,此時它們能夠由程序中的任何函數自由訪問。另外,類的成員還能夠指定爲private,此時它們只能被類的成員函數或友元函數訪問。

·類的數據成員能夠定義爲static。不管類中建立了多少個對象,類中的靜態數據成員都只有一個。

·能夠在類對象的成員函數中訪問類的靜態數據成員,它們不是類對象的一部分,類對象的大小不包括靜態數據成員的字節數。

·即便沒有建立類的對象,類的靜態函數成員也存在,並能夠調用。

·類的每一個非靜態函數成員上都包含指針this,它指向調用該函數的當前對象。

·類的靜態函數成員不包含指針this。

·類中聲明爲const的成員函數不能修改類對象的數據成員,除非數據成員聲明爲mutable。

·把類對象的引用用做函數調用的參數,能夠避免產生把複雜對象傳送給函數的系統開銷。

·副本構造函數能夠用類中已有的對象初始化同一個類中的新對象。若是沒有定義類的構造函數,編譯器就會生成默認的副本構造函數。

 

 

第13章 類的操做

·只能經過構造函數的初始化列表來初始化類的引用成員。引用不能用賦值語句來初始化。

·只要給函數按值傳送對象,就會調用副本構造函數。其結果是傳送給類的副本構造函數的參數必須是一個引用。

·若是在類的成員函數中動態分配內存,就老是要執行析構函數來釋放內存、實現副本構造函數和副本賦值運算符。

·把類的全部成員都聲明爲private,就能夠限制對類的訪問。此時,只有友元類能夠建立該類類型的對象。

·嵌套類是把本身的定義放在另外一個類定義的內部。嵌套類的名稱在包含類的做用域內。爲了在包含類的外部引用嵌套的類類型,類型名稱必須用包含類的名稱來限定。

·若是嵌套類的定義放在包含類的私有部分,嵌套類類型的對象就不能在包含類的外部建立。

 

 

第14章 運算符重載

·在類中能夠重載任何運算符,以提供針對該類的功能。但做用域解析運算符、條件運算符、成員訪問運算符、解除類成員指針的引用運算符和sizeof運算符不能重載。

·運算符函數能夠定義爲類的成員或全局運算符函數。

·若是一元運算符定義爲類的成員函數,操做數就是類對象。

·若是一元運算符定義爲全局運算符函數,操做數就是類對象。

·若是二元運算符定義爲類成員函數,左操做數就是類對象,右操做數就是函數的參數。

·若是二元運算符定義爲全局運算符函數,第一個參數指定左操做數,第二個參數指定右操做數。

·要重載遞增運算符,須要用兩個函數分別提供運算符的前綴和後綴形式。實現後綴運算符的函數有一個int類型的額外參數,它僅用於與前綴函數區分。遞減運算符也是這樣。

·實現+=運算符重載的函數能夠用在+函數的重載上。全部op=運算符都是這樣。

·智能指針是一個操做相似於指針的對象。智能指針的一種形式是迭代給定類型的對象的複雜集合,採用的方式與通常指針相似。標準模板庫擴展使用了這種形式。

 

 

第15章 繼承

·類能夠派生自一個或多個基類,此時派生類在其全部的基類中繼承成員。

·單一繼承就是從一個基類中派生新類。多重繼承就是從兩個或多個基類中派生新類。

·訪問派生類的繼承成員由兩個因素控制:基類中成員的訪問指定符和在派生類聲明中基類的訪問指定符。

·派生類的構造函數負責初始化類的全部成員,包括繼承的成員。

·建立派生類對象通常須要按順序(從最通常的基類開始到最特殊的直接基類)調用全部直接和間接基類的構造函數,以後執行派生類的構造函數。

·派生類構造函數能夠在初始化列表中顯式調用直接基類的構造函數。

·在派生類中聲明的成員名,若是與繼承的成員名相同,就會遮蓋繼承的成員。爲了訪問被遮蓋的成員,可使用做用域解析運算符和類名來限定成員名。

·若是派生類有兩個或多個直接基類,就會包含同一個類的兩個或多個繼承子對象,此時,把重複的類聲明爲虛基類,就能夠避免出現重複。

 

 

第16章 虛函數和多態性

·多態性是經過指針或引用調用函數,並且調用是動態解析的,即在程序執行時解析。

·基類中的函數能夠聲明爲virtual。在派生於該基類的全部類中,這會迫使該函數問題虛函數。在經過指針或引用調用虛函數時,函數調用就是動態解析的。函數調用的對象類型將肯定所使用的函數版本。

·使用對象和直接成員選擇運算符來調用虛函數,該函數調用就是靜態解析的,即在編譯期間解析。

·若是基類包含虛函數,就應把基類的析構函數聲明爲virtual。這會確保爲動態建立的派生類對象選擇正確的析構函數。

·純虛函數沒有定義。基類中的虛函數在函數聲明的最後加上=0,就變成了純虛函數。

·包含一個或多個純虛函數的類稱爲抽象類,這種類不能建立對象。在該類的任何派生類中,必須定義所繼承的全部純虛函數。不然,該派生類也是抽象類,也不能建立該類的對象。

·虛函數的默認參數值是靜態賦予的,若是虛函數的基類版本有默認參數值,在派生類中指定的默認參數值就會被忽略,由於虛函數調用是動態解析的。

·能夠聲明類成員的指針。它們能夠是數據成員的指針,也能夠是函數成員的指針。這類指針要與對象、對象的引用或指針一塊兒使用,來引用成員指針定義的對象的類成員。

 

 

第17章 程序錯誤和異常處理

·異常是用於在程序中警示錯誤的對象。

·可能拋出異常的代碼一般包含在try塊中。

·處理在try塊中拋出的各類類型異常的代碼放在該try塊後面的一個或多個catch塊中。

·try塊及其catch塊能夠嵌套在另外一個try塊中。

·參數爲基類類型的處理程序能夠捕獲派生類類型的異常。

·若是異常沒有被catch塊捕獲,就調用terminate()函數,該函數會接着調用abort()。

·標準庫定義了一組標準異常。

·異常說明限制了函數能夠拋出的異常類型。

·若是函數拋出的異常類型不在該函數的異常說明的容許範圍以內,就會調用unexpected()函數。

·能夠改變unexpected()函數的默認操做,方法是實現本身的unexpected()處理程序,把該函數指針傳送給set_unexpected()函數,以創建該處理程序。

·構造函數的函數try塊能夠包含初始化列表和構造函數體。

·uncaught_exception()函數容許檢測因拋出異常而調用的析構函數。

 

 

第18章 類模板

·類模板定義了一系列類類型。

·類模板的實例是根據給定的模板參數集,從該模板中生成的類定義。

·聲明類模板類型的對象,就會對類模板進行隱式實例化。

·類模板的顯示實例化,會根據類模板的給定參數集定義一個類。

·對應於類模板中類型參數的參數,其類型能夠是基本類型、類類型、指針或引用類型。

·非類型參數能夠是整型類型、枚舉類型、指針或引用。

·類模板的部分說明能夠根據原類模板中參數的一組限定子集,定義一個新模板。

·類模板的徹底說明能夠根據原類模板的全部參數參數,定義一個新模板。

·類模板的友元能夠 函數、類、函數模板或類模板。

·普通的類能夠把類模板或函數模板聲明爲友元。

 

 

第19章 輸入輸出操做

·標準庫支持字符流的輸入輸出操做。

·輸入和輸出的標準流是cin和cout,還有錯誤流cerr和clog。

·提取和插入運算符提供了格式化的流輸入輸出操做。

·文件流能夠與磁盤上的文件關聯起來,進行輸入、輸出或輸入輸出。

·文件打開模式決定了是從流中讀取數據,仍是給流寫入數據。

·若是建立了一個文件輸出流,並把它與一個文件自己不存在的文件名關聯起來,就會建立該文件。

·文件有開頭、結尾和當前位置。

能夠把文件流的當前位置改成之前記錄的某個位置。這個位置與流開關的偏移量爲正,與流結尾的偏移量爲負,而與流當前位置的領銜量能夠爲正,也能夠爲負。

·爲了支持類對象的流操做,能夠重載插入和提取運算符,使這些運算符函數成爲類的友元。

·字符串流類提供了string對象的流輸入輸出操做。

 

 

第20章 標準模板庫

·STL經過三類模板提供了功能:容器、迭代器和算法。

·容器提供了存儲和組織任意類型的對象的各類方式,但要存儲的對象類型必須知足元素的基本要求。

·迭代器是操做方式像指針的對象。迭代器是智能指針的示例。

·迭代器能夠訪問容器中的對象,或從流中提取對象。

·迭代器成對使用時,能夠在序列的半開間隔中定義一組對象。第一個對象包含在間隔中,而最後一個對象不包含在間隔中。

·算法是通常化的標準函數,能夠處理迭代器指定的對象集。

·算法獨立於容器,但能夠經過迭代器應用於任何容器中的對象。

相關文章
相關標籤/搜索