第二章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 下面...