高質量C C 程式設計之函式設計

2021-06-21 11:06:58 字數 2724 閱讀 8163

函式介面的兩大要素是引數和返回值。

c語言中,函式的引數和返回值的傳遞方式有兩種值傳遞pass by value和指標傳遞pass by pointer。

c++中,更多採用的是引用傳遞pass by reference。引用傳遞性質像指標傳遞,但使用方式更像值傳遞。

1.引數的規則

規則1: 引數的書寫要完整,不能貪圖省事只寫引數型別而忽略引數名字,如果函式沒有引數,用void填充。

規則2: 引數命名要恰當,順序要合理:一般地將目的引數放在前面,源引數放在後面

規則3: 如果引數是指標,且僅做輸入使用,則應在型別前面加const,防止該指標在函式體中被意外修改

規則4: 如果輸入引數以值傳遞的方式傳遞物件,則宜改用「const&」方式來傳遞,這樣可以省去臨時物件的構造和析構,從而提高效率

建議1: 避免函式有過多的引數,引數個數應該盡量控制在5個以內,

建議2: 盡量不要使用型別和數目不確定的引數

庫函式int printf(const char *format[,arguments]...)就是這樣的典型代表

這種風格的函式在編譯時喪失了嚴格的型別安全檢查。

2.返回值的規則

規則1: 不要省略返回值的型別

c語言中,凡不加型別說明的函式,一律自動按照整型處理。

為了避免混亂,規定c/c++函式必須有型別,如果函式沒有返回值,應該宣告為void型別。

規則2: 函式名與返回值型別在語義上不能有衝突

如:int getchar(void);  

規則3: 不要把正常值和錯誤標識混在一起返回

正常值用輸入引數獲得,而錯誤標識用return語句返回。

bool getchar(char *c);

建議1: 有些函式本來沒有返回值,但是為了增加靈活性如支援鏈式表示式,可以附加返回值。

如字串拷貝函式strcpy的原型:

char* strcpy(char *strdest,char *strsrc);

鏈式表示式:int len = strlen(strcpy(pstrdest,pstrsrc));

建議2: 如果函式的返回值是乙個物件,有些場合可以用引用傳遞替代值傳遞,可以提高效率,前提是不能出錯。

class string

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

string string::operator+(const string &str1,const string &str2)

3.函式內部實現規則

規則1: 在函式的入口處,對引數的有效性進行檢查

充分理解並使用斷言assert

規則2:在函式的出口處,對return語句的有效性和效率進行檢查

# 不可返回「棧記憶體」中的指標或引用,因為該內存在函式結束時將自動銷毀

char* func(void)

# 要搞清楚返回的是值、指標還是引用

# 如果函式返回的是乙個物件,需要考慮return語句的效率

return string(s1 + s2);        //建立乙個臨時物件,並返回它,

//直接在外部記憶體的單元初始化臨時物件,省去了拷貝和析構,提高了效率

解讀一下**:

string temp(str1 + s2);        //temp物件被完成,並完成初始化

return temp;                //拷貝建構函式將tenp拷貝到儲存返回值的外部記憶體單元,然後呼叫析構函式銷毀temp物件

4.其他建議

建議1: 函式功能單一,不要涉及多用途的函式

建議2: 函式體規模要小,控制在50行**以內

建議3: 盡量避免函式帶有記憶功能,相同的輸入應該有相同的輸出。

這樣的函式不易於測試和維護

在c/c++語言中,函式的static區域性變數是函式記憶儲存器,應該盡量少用static區域性變數,除非必須。

建議4: 不僅要檢查引數的有效性,還要檢查通過其他途徑進入函式體內的變數的有效性,比如全域性變數和檔案控制代碼等

建議5: 用於出錯處理的返回值一定要明確,使使用者不容易忽視或誤解錯誤情況

5.使用斷言

程式一般分為debug版本和release版本,debug版本用於內部除錯,release版本發行給使用者使用。

斷言assert是只在debug版本中起作用的巨集,它用於檢查不應該發生的情況。

assert是巨集,為了不引起在debug版本和release版本的差異,將assert定義為巨集。

程式設計師可以把assert看成是任何系統狀態下都可以安全使用的無害測試手段。

規則1: 使用斷言捕捉不應該發生的非法情況

不要混淆非法情況和錯誤情況,對於錯誤情況是要一定要做處理的

規則2: 在函式的入口,使用斷言檢查引數的有效性

建議1: 確定假定,使用斷言對假定進行檢查

6.引用與指標的比較

引用的一些規則:

1)引用被建立的同時必須被初始化(指標則可以在任何時候被初始化)

2)不能有null引用,引用必須和合法的儲存單元關聯(指標可以指向null)

3)一旦被初始化,不能改變引用關係(指標則可以隨時改變所指的物件)

引用的主要功能是傳遞函式的引數和返回值。

c++中,函式的引數和返回值的傳遞方式有三種:值傳遞,指標傳遞,引用傳遞

引用傳遞的性質象指標傳遞,但是書寫方式象值傳遞。

指標毫無約束地使用記憶體單元的任何東西,功能強大,但十分危險。

如果只需要借用下某物件的別名,使用引用。

C C 高質量程式設計之常量

常量的值在執行期間恆定不變,c語言用巨集來定義常量,c 還能用const定義。const比巨集相對來說更好,因為巨集沒有型別,而const可以定義常量型別,有型別安全檢查,易於除錯。在程式中使用常量的優勢 1.增加程式可讀性 2.減少 出錯率 3.易於修改數字或字串。一 盡量使用含義直觀的常量來表示...

高質量程式設計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章 應在關聯性不強的語句間新增空行 一行 只做一件事...