C C 高質量程式設計筆記

2021-06-02 22:35:21 字數 3493 閱讀 7343

怕忘記的一些重點,呵呵。

1 運算子優先順序

( ),,->,.,!,~,++,--,sizeof,(正負)+,-,(指標)*,&,*,/,%,+,-,《,》,...

2 if 語句判斷條件

布林型if (flag) or if(!flag)

整型if (value==0) or if (value!=0)

浮點型if ((x>=-epsinon) && (x<=epsinon))

指標if (p == null) or if (p != null)

3 迴圈語句效率

多重迴圈時,最短的迴圈放在最外層,以減小cpu跨切迴圈層的次數。

公共語句放在迴圈體外。

4 常量

#define max 100

const int max = 100;

const 常量有資料型別,編譯器可以進行型別安全檢查。

巨集常量則沒有,並且在字元替換時可能會產生意料不到的錯誤。

對外公開的常量放在標頭檔案中,私密的常量放在定義檔案的頭部。

類中的常量

const資料成員只在某個物件生存期內是常量,不同物件的值可以不同。

class a

const 資料成員的初始化只能在類建構函式的初始化表中進行:

class a

a::a(int size) : size(size)

5 函式設計

c語言中,函式的引數和返回值的傳遞方式有兩種:值傳遞和指標傳遞,c++中多了引用傳遞。

(1)引數要書寫完整,沒有引數則用void填充

(2)如果引數是指標,且僅作輸入用,則應在型別前加const

(3)如果輸入引數是以值傳遞的方式傳遞物件,則宜改用const &的方法傳遞,省去臨時物件的構造和析構。

(4)如果函式的返回值是乙個物件,有些場合用「引用傳遞」可以提高效率,而有些場合只能用值傳遞,而不能用「引用傳遞」。

如class string

賦值函式中返回*this的引用。

相加操作函式中返回乙個臨時的string值,如果改用引用傳遞,那麼函式返回值是乙個指向區域性物件的引用,由於函式結束時區域性物件將自動銷毀,將導致返回的引用無效。

6 函式內部實現的規則

(1)在函式的入口處,對引數的有效性進行檢查。

使用assert,來防止非法引數(呼叫者出了差錯)。

(2)在函式的出口處,對return 語句的正確性和效率進行檢查。

* return 語句不可返回指向"棧記憶體"的指標或者引用。

* 搞清楚返回的究竟是值、指標還是引用。

* 如果返回值是乙個物件,要考慮return語句的效率。

return string(s1+s2);

與string temp(s1+s2);

return tem;

後者需要建立temp物件,同時完成初始化,然後拷貝建構函式把temp拷貝到儲存返回值的外部儲存單元中

,最後要銷毀temp.前者只需建立乙個臨時物件並返回它,效率更高。

7 引用與指標的比較

* 引用被建立時必須初始化

* 一旦引用被建立,就不能改變引用的關係(指標可以改變所指的物件)

* 引用更安全

8 記憶體管理

記憶體分配的三種方式:

* 從靜態儲存區域分配。內存在程式編譯的時候就已經分配好,在程式整個執行期間都存在。例如全域性變數,static變數。

* 在棧上建立。函式內區域性變數的儲存單元在棧上建立,函式執行結束時自動釋放。效率較高,但是分配的記憶體容量有限。

* 在堆上分配,動態記憶體分配,使用malloc或new建立,使用free或delete釋放。

9 指標使用要點:

判斷記憶體分配是否成功,初始化,不要越界,釋放分配的記憶體,釋放後賦null。

10 指標與陣列的對比

陣列在靜態儲存區或棧上建立,在生存期內對應一塊記憶體,其位址與容量保持不變,只有陣列的內容可以改變。

指標可以隨時指向任意型別的記憶體。

* 修改內容

char a="hello";

a[0]='x';//正確

char *p="world";

p[0]='x';//錯誤

指標p指向常量字串"world"(位於靜態儲存區,內容為world\0),常量字串的內容是不可以被修改的。

* 內容複製與修改

複製字串應用strcpy

比較字串應用strcmp

* 計算記憶體容量

用運算子sizeof可以計算陣列的容量,但是不能計算指標所指的記憶體容量。

char a="hello world";

char *p = a;

cout正確的方法:用指標的指標,用指標的引用,或者返回動態記憶體

void getmemory1(char **p, int num)

void getmemory1(char *&p, int num)

char* getmemory1(int num)

12 malloc/free與new/free的區別

* malloc/free是c++/c語言的標準庫函式,new/delete是c++的運算子

* new/free能自動執行物件的建構函式和析構函式

int *p1 = (int *)malloc(sizeof(int)*length);

int *p2 = new int[length];

obj *a = new obj;

obj *b = new obj(1);

obj *c = new obje[100](1);//錯誤

如果p不是null指標,那麼free或delete對p連續操作再次會導致程式執行錯誤。

13 過載、內聯、const、vitual:

extern跟c++的函式過載有關係。

c和c++對函式的處理方式是不同的.extern "c"是使c++能夠呼叫c寫作的庫檔案的乙個手段,如果要對編譯器提示使用c的方式來處理函式的話,那麼就要使用extern "c"來說明。

14 建構函式、析構函式與賦值函式

類的四個缺少函式:

a(void); //預設的無引數建構函式

a(const a &a);// 預設的拷貝建構函式

~a(void);//預設的析構函式

a& operate=(const a &a);//預設的賦值函式

預設的拷貝建構函式與賦值函式,採用位拷貝而不是值拷貝。

例:string類的設計

class string

;string::string(const char *str)

else

}string::~string()

string::string(const string &other)

string& string::operator =(const string &other)

void string::print()

如果有人試圖進行如下操作,編譯器將指出錯誤:

a b(a);//呼叫了私有的拷貝建構函式

b = a;   //呼叫了私有的賦值函式

高質量程式設計C C

一 請填寫bool float,指標變數與 零值 比較的 if 語句。10 分 請寫出 bool flag 與 零值 比較的 if 語句。3 分 標準答案 if flag if flag 如下寫法均屬不良風格,不得分。if flag true if flag 1 if flag false if f...

高質量c c 程式設計

第1章 為防止標頭檔案被重複引用,應當用 ifndef define endif 結構產生預處理塊 使用 include引用標準庫標頭檔案,使用 include filename.h 引用非標準庫標頭檔案 標頭檔案中只存放 宣告 不存放 定義 第2章 應在關聯性不強的語句間新增空行 一行 只做一件事...

高質量c c 程式設計 5

第5章 常量 常量是一種識別符號,它的值在執行期間恆定不變。c語言用 define來定義常量 稱為巨集常量 c 語言除了 define外還可以用const來定義常量 稱為const常量 5.1 為什麼需要常量 如果不使用常量,直接在程式中填寫數字或字串,將會有什麼麻煩?1 程式的可讀性 可理解性 變...