C Primer中文版第四版 讀書筆記

2021-05-27 08:44:51 字數 2782 閱讀 1580

2011.8.10

p46: 只有當extern 宣告位於函式外部時,才可以含有初始化式。

extern double pi = 3.1416;  //pi 是乙個全域性變數,這是乙個定義

p50: 在全域性作用域宣告的const 變數是定義該物件的檔案的區域性變數(僅作用在該檔案中),要使 const 變數能夠在其他檔案中被訪問,必須顯示指定為extern。

引用就是物件的另乙個名字,主要用於函式的形式引數;不能定義引用型別的引用,但可以定義其他任何型別的引用。

引用必須在定義時就進行初始化,且初始化後一直指向初繫結的物件。

const 引用可以用不同型別但相關的物件來初始化;也可以用右值進行初始化。

const int &r = 42; //用右值

double dval = 3.14;

const int &ri = dval; //用double 來初始化,這只適用於const的情況

p56:c++中struct 與 class 的區別僅在於預設訪問級別,前者預設是public的,後者預設是private的。

p59:標頭檔案中不應含有變數或函式的定義,但有三個例外:

1. 標頭檔案中可以定義類

2. const 物件,值在編譯時就已經知道的const物件

3.inline函式

p75:當string物件和字串字面值進行混合連線時,+ 操作符的左右運算元必須至少有乙個string型別的。

p80:q: 標準庫vector如何(預設)初始化沒有定義任何建構函式的類型別?

a:這種情況下,標準庫仍產生乙個帶初始值的物件,這個物件的每個成員進行了值初始化

。??

容器與迭代器,暫時看成更高階的陣列和指標。

bitset<32> bv(1010101); //好吧,第一眼看錯了,1010101是十進位制

2011.8.11

如果陣列的元素型別是類型別,不管陣列在**定義都自動呼叫該類的預設建構函式進行初始化;

如果該類沒有預設建構函式,則必須為該陣列的元素提供顯式初始化。

乙個vector物件可以用另乙個vector物件直接初始化。

c++中提供一種void * 指標型別,它可以儲存任何型別物件的位址,不允許用void * 指標操縱它所指向的物件。

指標和引用的比較

定義引用時必須初始化;賦值行為的差異,給引用賦值是修改該引用所關聯的物件的值,給指標改值就使指標指向了不同的物件。

理解指向const  物件的指標和const 指標的不同含義。

不能使用void * 指標儲存const 物件的位址,而必須使用const void * 指標來儲存。

不能保證指向常量的指標所指物件的值一定不可修改。

p112:在typedef 中使用指標;const的位置不同會引起理解的偏差。

在堆heap中建立的動態陣列是沒有名字的,只能通過位址間接訪問堆中的物件。

2011.8.12

一般的陣列可以用初始化列表為陣列元素提供不相同的初值;

動態分配的陣列,其元素只能初始化為元素型別的預設值:

int * arr = new int[10](); //在g++中測試,()使每個元素初始化為0
c++中允許定義類型別的const陣列,但該類型別必須提供預設建構函式。

不能用陣列直接初始化乙個陣列,但可以用陣列(還可以是其字首子集)來初始化乙個vector物件。

typedef int int_array[4]; //給乙個大小為4的int陣列取乙個別名為int_array
int_array * ip = ia;//用乙個二維陣列名ia初始化ip

2011.8.15

關係操作符不能串接使用,如   if(i位操作符使用整型的運算元,其操作的整型可以是有符號的和無符號的,位操作符如何處理符號位依賴於機器。

& |  異或,<< 左移。

使用復合賦值操作時,左運算元只計算了一次;而使用相應的長表示式時,該運算元計算了兩次。

對於++ 和--操作符,使用前置操作所要做的工作更少。

理解類似於 *iter++ 這樣的語句。

c++ 為什麼不叫做++c。

關於delete 和delete。

逗號表示式的值是其最右邊表示式的值。

在delete之後,最好將指標設為0、空、null。

const int * pci = new const int(1023);  //動態建立乙個常量物件

delete pci;                             //在堆中建立的常量也是可以被**的

使用const_cast將轉換掉表示式的const性質。

求最大公約數——輾轉相除法

p201:文中說c語言中,具有const 形參或非const 形參的函式並無區別。//有待考證

千萬不能返回區域性變數的引用。

求最大公約數的遞迴版本p216。

內聯函式的定義必須在標頭檔案中。

編譯器隱式的將在類內定義的成員函式當作內聯函式。

為所有形參提供預設實參的建構函式也屬於預設建構函式,所以說預設建構函式的形參列表不一定為空。

類中的靜態成員函式不能被宣告為const,

靜態成員函式也不能被宣告為虛函式。

(待續)

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宣告不是定義,也不分配儲存空間。事實上,它只是說明變數定義在程式的其他地方。程式中變數可以宣告多次,但只能定義一次。如果宣告有初始化式,那麼它...