C primer 讀書筆記(2,4,5章節)

2021-05-26 05:01:35 字數 4464 閱讀 5782

第二章1.關於什麼是物件? 一般而言,物件就是記憶體中具有型別的區域,說的具體一點,就是計算左值表示式就會產生物件。

2.關於初始化,分為直接初始化(direct-initialization)和複製初始化(copy-initialization),直接初始化是把初始化式放在括號裡,複製初始化語法用等號(=):

如: int ival(1024);    //direct_initialization

int ival=1024;    // copy-initialization;

此外,初始化指建立變數並給它賦初始值,而賦值則是擦除物件的當前值並用新的值替代。

3.變數的初始化規則:內建型別變數是否自動初始化取決於變數定義的位置。在函式體外定義的變數都初始化成0,在函式體內定義的內建型別變數不進行自動初始化。

4.const物件預設為檔案的區域性變數,與其他變數不同,除非特別宣告,在全域性作用於宣告的const變數是定義該物件的檔案的區域性變數,此變數只存在那個檔案中,不能被其他檔案訪問。

5.引用:引用是一種復合型別,通過在變數名前面天劫「&」符號來定義。在引用的情況下,每一種引用型別都「關聯到」某一其他型別,不能定義引用型別的引用,但可以定義任何其他型別 的引用。

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

int ival=1024;

int &refval=ival;   //ok

int &refval2;        //error: a reference must be initialized

int &refval3=10   //error: initializer must be an object

引用是別名,它是繫結物件的另乙個名字,作用在引用上的所有操作事實上都是作用在該引用的物件上。

當引用初始化後,只要該引用存在,它就保持繫結到初始化時指向的物件。不可能將引用繫結到另乙個物件上。

const 引用是指向const物件的引用

const int ival=1024;

cosnt int &refval=ival;  //ok

int &ref2=ival;             //error: nonconst reference to a const obeject

非const引用只能繫結到與該引用同型別的物件。

const引用則可以繫結到不同但相關的型別的物件或繫結都右值。

6.,列舉:列舉的定義包括關鍵字enum,其後是乙個可選的列舉型別名,和乙個用花括號括起來,用逗號分開的列舉成員列表。

不能改變列舉成員的值。列舉成員本身就是乙個常量表示式,所以也可用於常量表示式能用的任何地方。

列舉型別的物件的初始化或賦值,只能通過其列舉成員或同一列舉型別的其他物件來進行。

如: open_modes om1=input;

open_modes om2=2;         //error: om2 initialized with int

om1=point;                     //error: point is not a open_modes enumerator

om2=output;                 //ok.

7.標頭檔案:a:標頭檔案用於宣告而不是定義

標頭檔案可以定義類,值在編譯時就已經知道的const物件和inline物件。

b:  一些const物件定義在標頭檔案中

c++中的任何變數都只能定義一次,定義會分批儲存空間,而所有對該變數的使用都關聯到同一儲存空間。當我們在標頭檔案中定義了const變數後,每個包含該標頭檔案的原始檔都有了自己的const變數,其名稱和值都一樣。當該const變數使用常量表示式初始化時,可以保證所有的變數都有相同的值,但是在實踐中,大部分的編譯器都會用相應的常量表示式來替換對這些const變數的使用,所以,在實踐中不會有任何儲存空間用於儲存用常量表示式初始化的const變數。

第四章  陣列和指標

1.陣列

非const常量以及要到執行階段才知道其值的const變數都不能用於定義陣列的維數。

字串字面值包含乙個額外的空字元(null)用於結束字串

char c1=;                            //no null

char c2=;                       //explicit null

char c3="c++";                                   //null terminator add automatically

陣列不允許直接賦值和複製。

用下標訪問元素時,vector使用vector::size_type作為下標型別,而陣列下標的正確型別則是size_t.

2.指標

許多有用的程式都不可使用陣列或者指標實現,現代c++程式採用vector型別和迭代器取代一般的陣列,採用string型別取代c風格字串。

指標初始化和賦值操作的約束

a  0值常量表示式,例如,在編譯時課獲得0值整型const物件或字面值常量0

b  型別匹配的物件的位址

c   另一物件之後的下一位址

d   同型別的另乙個有效指標

int ival;

int zero=0;

const int c_ival=0;

int *pi=ival;                 //error: pi initialized from int value of ival

pi=zero;                     //error: pi assigned int value of zero

pi=c_ival;                  //ok: c_ival is a const with compile-time value of 0

pi=0;                         //ok: directly initialize to literal constant 0

關於void*指標

與另乙個指標進行比較:向函式傳遞void*指標賦值。不允許使用void*指標操縱它所指向的物件。

關於指標和const限定符

把乙個const物件的位址賦給乙個普通的,非const物件的指標也會導致編譯時的錯誤。

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

如果只向const的指標所指的物件並非const,則可直接給物件賦值或者間接地利用普通的非const指標修改其值,畢竟這個值不是const,重要的是要記住,不能保證指向const的指標所指的值一定不可修改。

關於指標和typedef

typedef string *pstring;

const pstring cstr;

等價於string *const cstr;

3.動態建立陣列

每乙個程式在執行時都占用一塊可用的記憶體空間,用於存放動態分配的物件,此記憶體空間稱為程式的自由儲存區(free store)或者堆(heap),c語言使用malloc和free在自由儲存區中分配儲存空間,而c++語言則使用new和delete表示式實現相同的功能。

可以在陣列的長度後面加一堆空圓括號,對陣列元素做值初始化。

int *pia=new int[10]();                         //array of 10 initialized ints,  本例中個元素都為0

關於const物件的動態陣列。

const int *p=new const int[100];                         //error:uninitialized const array

const int *p=new const int[100]();                        //ok:value-initialized const array

關於新舊**的相容: 可以使用c風格字串對string物件進行初始化或者賦值

string型別的加法操作需要2個運算元,可以使用c風格字串作為其中的乙個運算元,也允許將c風格字串用作符合賦值操作的右運算元。

c_str函式返回c風格字串,其字面意思是:「返回c風格字串的表示方法」。

第五章  表示式

1.new和delete表示式

int *p=new int;                   //p points to an uninitialzed int

int *p=new int();                //p points to an int value_initialized to 0   

值初始化的()必須置於型別名的後面,而不是變數後,例如:

int x();                  //does not value initialze x

這個語句宣告了乙個名為x,沒有引數返回int值的函式

如果指標指向的不是用new分配的記憶體位址,則在該指標上使用delete是不合法的。

一旦刪除了指標所指向的物件,立即將指標置為0,這樣就可以非常清楚的表明指標不再指向該物件。

C primer 讀書筆記

第2 章 變數和基本型別 1 變數直接初始化和變數 複製初始化 int ival 1024 direct initialization int ival 1024 copy initialization 初始化不是賦值 2 內建型別復 制初始化和直接初始化幾乎沒有區別 但 對類型別物件來 說,有些初...

C Primer讀書筆記

前些日子開始看 c primer 順便做一些筆記,既有書上的,也有自己理解的。因為剛學c 不久,筆下難免有謬誤之處,行文更是凌亂 所幸不是用來顯配的東西,發在linuxsir只是為了方便自己閱讀記憶,以防只顧上網忘了正事。書看了不到一半,所以大約才寫了一半,慢慢補充。const要注意的問題 1 下面...

C Primer讀書筆記

前些日子開始看 c primer 順便做一些筆記,既有書上的,也有自己理解的。因為剛學c 不久,筆下難免有謬誤之處,行文更是凌亂 所幸不是用來顯配的東西,發在linuxsir只是為了方便自己閱讀記憶,以防只顧上網忘了正事。書看了不到一半,所以大約才寫了一半,慢慢補充。const要注意的問題 1 下面...