C primer 注意的知識點(第 章)

2021-05-24 07:26:35 字數 2917 閱讀 2769

1)

從邏輯上來講,

size

()成員函式似乎應該返回整形數值,或如

2.2節「建議」中所述的無符號整數。但事實上,

size

操作返回的是

string::size_type

型別的值。我們需要對這種型別做一些解釋。string

類型別和許多其他庫型別都定義了一些配套型別(companion type)。通過這些配套型別,庫型別的使用就能與機器無關(machine-independent)。size_type

就是這些配套型別中的一種。它定義為與

unsigned

型(unsigned int

或unsigned long

)具有相同的含義,而且可以保證足夠大能夠儲存任意

string

物件的長度。 2)

通常,c++

程式中應採用

cname

這種標頭檔案的版本,而不採用

name.h

版本,這樣,標準庫中的名字在命名空間

std中保持一致。使用

.h版本會給程式設計師帶來負擔,因為他們必須記得哪些標準庫名字是從

c繼承來的,而哪些是

c++所特有的。 3)

雖然可以對給定元素個數的

vector

物件預先分配記憶體,但更有效的方法是先初始化乙個空

vector

物件,然後再動態地增加元素。

4)現代c++ 程式應盡量使用vector 和迭代器型別,而避免使用低階的陣列和指標。設計良好的程式只有在強調速度時才在類實現的內部使用陣列和指標。 5)

陣列的維數必須用值大於等於1的常量表示式定義。此常量表示式只能包含整型字面值常量、列舉常量或者用常量表示式初始化的整型const 物件。非const 變數以及要到執行階段才知道其值的const 變數都不能用於定義陣列的維數。

const unsigned sz = get_size();// const

value not known until run time

int vals[sz];// error:

size

not known until run time 6)

兩個指標減法操作的結果是標準庫型別(library type)ptrdiff_t(在vc6.0下其實是int型) 的資料。與size_t 型別一樣,ptrdiff_t 也是一種與機器相關的型別,在cstddef 標頭檔案中定義。size_t 是unsigned 型別,而ptrdiff_t 則是signed 整型。size_t 型別用於指明陣列長度,它必須是乙個正數;ptrdiff_t 型別則應保證足以存放同一陣列中兩個指標之間的差距,它有可能是負數。 7)

在typedef中使用指標往往會帶來意外的結果。下面是乙個幾乎所有人剛開始時都會答錯的問題。假設給出以下語句:

typedef string *pstring;

const pstring cstr;

請問cstr 變數是什麼型別?簡單的回答是const pstring 型別的指標。進一步問:const pstring 指標所表示的真實型別是什麼?很多人都認為真正的型別是:const string *cstr; 也就是說,const pstring 是一種指標,指向string 型別的const 物件,但這是錯誤的。錯誤的原因在於將typedef 當做文字擴充套件了。宣告const pstring 時,const 修飾的是pstring 的型別,這是乙個指標。因此,該宣告語句應該是把cstr 定義為指向string 型別物件的const 指標,這個定義等價於:string *const cstr。

string s;

typedef string *pstring;

const pstring cstr1 = &s; // written this way the type

is obscured

pstring const cstr2 = &s; // all three decreations are

the same type

string *const cstr3 = &s; // they're all const pointers

to string

8)c++

中,規定了運算元計算順序的操作符還有條件(?:

)和逗號操作符。除此之外,其他操作符並未指定其運算元的求值順序。

例如,表示式

f1() * f2();

在做乘法操作之前,必須呼叫f1 函式和f2 函式,畢竟其呼叫結果要相乘。然而,我們卻無法知道到底是先呼叫f1 還是先呼叫f2。 9)

對於內建型別或沒有定義預設建構函式的型別,採用不同初始化方式則有顯著的差別:

int *pi = new int;// pi points to an uninitialized int

int *pi = new int();// pi points to an int value-initialized to 0

第乙個語句的int 型變數沒有初始化,而第二個語句的int 型變數則被初始化為0。(注意gcc下可以,vc6.0下不行)

10)從istream 中讀取資料,並將此表示式作為while 迴圈條件:

string s;

while (cin >> s)

這裡隱式使用了io 標準庫定義的型別轉換。在與此類似的條件中,求解表示式cin >> s,即讀cin。無論讀入是否成功,該表示式的結果都是cin。

while

迴圈條件應為bool 型別的值,但此時給出的卻是istream 類型別的值,於是istream 型別的值應轉換為bool 型別。將istream 型別轉換為bool 型別意味著要檢驗流的狀態。如果最後一次讀cin 的嘗試是成功的,則流的狀態將導致上述型別轉換為bool 型別後獲得true 值——while 迴圈條件成立。如果最後一次嘗試失敗,比如說已經讀到檔案尾了,此時將istream 型別轉換為bool 型別後得false,while 迴圈條件不成立。

第3章知識點

方法宣告 修飾符 返回型別 方法名 形參 方法宣告如果形參的型別或個數不同即為過載 類都有乙個預設的構造方法,任何乙個物件的建立 都是由構造方法來建立 1.構造方法的修飾符只能是public 2.構造方法沒有返回值 3.構造方法的方法名跟類名一致 4.預設的構造方法沒有引數 5.一旦使用者自己定義了...

第5章 知識點

在某一段文字中突出顯示某幾個字,以粗體 紅色 大字型大小顯示,通常使用標籤 在css中,設定文字行高使用line height屬性 在css中設定背景顏色為透明的值為transparent 設定文字字型加粗的屬性是什麼?font weight bold 去掉列表項前標記符號的css屬性是什麼?lis...

第7章 知識點

display屬性 block inline inline bloc none 浮動屬性 左浮動 left 右浮動 right 不浮動 none 清除浮動 clear屬性 清除左邊浮動 left 清除右邊浮動 right 清除兩側浮動 both 不清除浮動 none 解決父級邊框塌陷的方法 浮動元素...