《C Primer 第四版》筆記與勘誤1

2021-04-23 00:38:21 字數 4605 閱讀 1707

《c++ primer 第四版》筆記與勘誤1

---------------------------------

以下筆記按在書中出現的先後順序來記載

p6  cout<

p7 一般出現空格符的地方都可以用換行符替代,只有兩個例外:一是預處理指示中,二是字串文字量中。

p23 預設情況下,讀cin或程式結束時,都會重新整理cout。cerr不帶緩衝,clog則帶。

p23 表示式是最小的計算單元,通常含有乙個或多個運算元,並通常含有乙個操作符。

p30 c++標準規定了每個算術型別的最小儲存空間,但是不阻止編譯器使用更大的儲存空間。對於int,幾個每個編譯器都使用比標準規定的儲存空間大的空間。

p30 c++算術型別共9種,其中整型6種,浮點型3種。

p31 int, short,long都預設為帶符號型。而char則是由編譯器決定預設是否帶符號。在vc7中,char預設也是帶符號的。

p32  unsigned 預設表示unsigned int。

p32  signed型別如何取值,如何用位來表示是依賴於編譯器的。

p32 如果被賦予超過取值範圍的值,一般編譯器不會報非法,而是對物件取模,比如將-1賦予unsigned物件,得255。(-1對256取模後的值)。但也有編譯器不是這樣實現的。

p33 對標準庫的計算建議使用size_type,浮點型計算建議使用double。

p33 大多數機器使用與long相似的32位來表示int;某些機器上,用double計算比float計算要快。

p34 只有內建型別存在字面值literal constant;換句話說,任何字面值都必然屬於某個內建型別。

p35 對於字面值,整型的可以在後面加l或u,前面加0或0x;浮點型可以在後面加l,f或e;字元型的可以在前面加l。

p41 c++共有63個關鍵字。

p42 一般來說,「直接初始化」(圓括號的初始化)比「複製初始化」(用等號的初始化)更靈活和效率更高。

p45 建議每個內建型別的變數都要初始化,雖然這樣做有時候不是必須的。

p46 帶初始化值的宣告被認為是定義。

p48 在物件第一次被使用的地方才定義物件,可以提高程式的可讀性。

p50 重要:非const變數預設就是extern的,但const常量預設卻是區域性於它所在的檔案的(目的是當它們是被常量表示式所初始化時,能被放到標頭檔案中,見p59)。所以,要想像讓const常量獲得像普通變數那樣的作用域,必須在它的初始化式的前面加上extern。

p51 引用是一種復合型別,「復合型別」是指用其他型別定義的型別。

除了不能定義引用型別的引用外,可以定義其它任何型別的引用。

引用必須用與該引用同型別的物件來初始化。

引用不能被重繫結到另一物件。

引用只是它繫結的物件的別名,任何作用在引用上的操作,實際都是作用在它繫結的物件上。

p52 只有const引用才可以用常量值或不同型別的變數初始化。非const引用則不可以。

p53 列舉的主要作用是定義一組整數常量集,同時指出它們是關聯的。

p54 列舉成員值可以是不唯一的。

每個enum語句都定義了一種惟一的型別。對它的使用方式類似於類型別的普通變數。

p55  class和struct的惟一區別是前者的訪問級別預設為private,後者則預設為public。

p59 標頭檔案不應該含有定義,但有三個例外:一是const常量,二是inline函式,三是類頭的定義。

p59 被常量表示式所初始化的const常量應該放到標頭檔案中,否則則不然。

p61 可以用定義在標頭檔案裡的實體(比如類)名來命名預處理器變數,來避免預處理器變數重名的問題,從而避免標頭檔案內容的重複包含,比如 #ifndef salesitem_h

p63 復合型別是指通過其他型別定義的型別,比如:引用,指標和陣列。

p64 物件是具有型別的一段記憶體區域,變數則是有名字的物件。

p64 預處理器繼承自c語言,c++的特徵大量減少了它的使用,但仍然保留乙個很重要的用法:#include

p64 作用域是程式的一部分,在其中的名字有意義(能起作用)。c++共有6種作用域,由小到大為:語句(如if),塊(大括號中),區域性(也稱函式內),命名空間(指namespace大括號內),類(類體的大括號中),全域性(在任何以上五種作用域以外的,也稱檔案?)

作用域可以巢狀,即在大的作用域中宣告的名字在小作用域中依然有效。

p65  c++是一種靜態型別語言,意思是它是在編譯時進行型別檢查的語言,在編譯時驗證表示式中出現的所有型別,是否可以執行它所需要的操作。變數在使用前必須被宣告或定義。

p65 「word(字)」是在給定機器上進行整型計算的原始單元。通常乙個字足以容納乙個位址。典型地,對於乙個32位的機器來說,乙個字是4個位元組。

p67 標準庫中其中兩種最重要的型別是:string 和vector,它們分別定義了大小可變的字串和集合。它們往往將迭代器用作伴隨型別,用於訪問自身中的元素。

p69 在標頭檔案中應該總是使用帶名字空間限定的名字,比如std::cout。(意思是帶限定的方式是對名字空間汙染比較小的方式了,比起 using namespace std;來說。而標頭檔案因為「其內容會完全拷貝到包含它的檔案中」,所以應該取汙染比較小的方式。)

p72  getline()函式的用處之一是讀入輸入流中有效字元之前的空白字元。

p73標準型別中常見的成員size_type比起unsigned的優勢是,它是與機器無關的。所以,在作為下標/索引,或儲存大小時,都建議用它,比如:

string::size_type  ix;

s1[ix]=』*』;

ix=s1.size();

p74 多數計算機上,涉及到字串比較中的單個字元時,大寫字母小於小寫字母。

p75 表示式計算時要考慮到結合性(比如是左結合(從左到右)還是右結合),

如下兩個賦值語句:

string s1;

string s2 = s1 + 「a」 + 「b」;

string s3= 「a」 + 「b」 + s1;

前者是合法的,後者則否;原因正在於string中的「 + 」號操作符是左結合的。

p78 c++標準庫除了定義了特定於c++本身的一些庫外,還包含了c標準庫。c標準庫原來的標頭檔案的名稱為.h,在c++中命名為,並被包含於名字空間std的域內。

p79 vector是乙個類模板,vector才是一種資料型別。

p80 重要:對於vecotr,比起對給定個數的它預先分配記憶體,更有效的方法是先初始化乙個空的vector元素,再動態地往裡面新增元素。

p82  c++程式設計師習慣於優先使用!=而不是《作為迴圈的判斷條件。這個習慣來自於泛型程式設計,有其合理性。

p82 在迴圈判斷中動態地呼叫size()而不是提前呼叫並儲存其值,同樣有其合理性。因為有些資料結構比如vector是可以在迴圈中動態增長的。

p84 在標準庫中,只有少數的容器(比如vector)支援下標操作,而所有容器都支援迭代器(都定義乙個名為iterator的型別)。因此,建議優先使用迭代器。

p86  const_iterator是乙個指向常量的iterator。

p87 difference_type的作用與size_type類似,區別在於它是signed型而已。

p88 任何改變vector長度的操作,都會使已存在的迭代器失效。

p88 bitset與vector類似都是乙個類模板,不過它各個物件之間的區別在於大小而不在於型別,比如bitset<32> bitvec;

p89 bitset匹配時是從低階開始匹配的。

(未完待續)

---------------------------------

以下個人勘誤按在書中出現的先後順序來記載

p13(第13頁) 「不是所有編譯器都有這一要求」後半句應翻譯為「都滿足這一標準」。

影響閱讀程度:嚴重

說明:「編譯器」如何能「要求」c++標準?原英文版中的「enforce」應翻譯為「滿足」而不是「有」,動賓關係才不會搞反。

p43 「有多個初始化式時不能使用複製初始化」前半句應翻譯為「有多個初始化引數時」。

影響程度:一般

p45 「如果定義某個類的變數時沒有提供初始化式….」這句和後一句應翻譯為「如果定義某個類的變數時沒有提供初始化引數,那麼系統會呼叫該類的』預設建構函式』。」

影響程度:一般

p50 有三處的「const變數」翻譯為「const常量」或「const物件」比較好,雖然原英文版有兩處也是用const variable。

影響程度:輕微

p52 「僅允許const引用繫結到需要臨時使用的值」應翻譯為「僅允許const引用繫結到需要臨時值中轉來完成繫結過程的物件」

影響程度:嚴重

說明:譯者對賓語的主體理解錯誤。原英文版中的「臨時使用的值」是用來修飾value(物件)的,不是最終的賓語。

因為對於程式設計師來說,編譯器做的中轉工作是透明的,const引用最終還是繫結到物件,雖然結果相同。

p65 「word(字)機器上的自然的整型計算單元」應翻譯為「word(字)是在給定機器上進行整型計算的原始單元」

影響程度:一般

p79 「v4含有值初始化的元素」這句應翻譯為「v4含有n個用預設建構函式中的值初始化的元素」

影響程度:嚴重

p79 「動態地新增元素」這句應翻譯為「當元素值已知時,最好是通過動態地向它新增元素,來讓它增長。」

影響程度:一般

c primer大綱(第四版)

第1章 快速入門 第一部分 基本語言 第2章 變數和基本型別 第3章 標準庫型別 第4章 陣列和指標 第5章 表示式 第6章 語句 第7章 函式 第8章 標準io庫 第二部分 容器和演算法 第9章 順序容器 第10章 關聯容器 第11章 泛型演算法 第三部分 類和資料抽象 第12章 類 第13章 複...

C primer(第四版)讀書筆記2

以下幾種情況都可能引發執行時或編譯時錯誤 1 delete不是new分配的空間 2 重複delete new分配的空間兩次以上 3 在釋放動態陣列時忘了方括號對 inti int pi i delete pi vs 2008 會執行時錯誤 string str dwarves delete str ...

C primer(第四版)讀書筆記5

extern int i declares but does not define i int i declares and defines i extern宣告不是定義,也不分配儲存空間。事實上,它只是說明變數定義在程式的其他地方。程式中變數可以宣告多次,但只能定義一次。如果宣告有初始化式,那麼它...