亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

高質量C++/C編程指南(六)

2024-09-07 17:00:55
字體:
來源:轉載
供稿:網友
第6章 函數設計
函數是C++/C程序的基本功能單元,其重要性不言而喻。函數設計的細微缺點很容易導致該函數被錯用,所以光使函數的功能正確是不夠的。本章重點論述函數的接口設計和內部實現的一些規則。

函數接口的兩個要素是參數和返回值。C語言中,函數的參數和返回值的傳遞方式有兩種:值傳遞(pass by value)和指針傳遞(pass by pointer)。C++ 語言中多了引用傳遞(pass by reference)。由于引用傳遞的性質象指針傳遞,而使用方式卻象值傳遞,初學者常常迷惑不解,容易引起混亂,請先閱讀6.6節“引用與指針的比較”。

6.1 參數的規則
l 【規則6-1-1】參數的書寫要完整,不要貪圖省事只寫參數的類型而省略參數名字。如果函數沒有參數,則用void填充。

例如:

void SetValue(int width, int height); // 良好的風格

void SetValue(int, int); // 不良的風格

float GetValue(void); // 良好的風格

float GetValue(); // 不良的風格

l 【規則6-1-2】參數命名要恰當,順序要合理。

例如編寫字符串拷貝函數StringCopy,它有兩個參數。如果把參數名字起為str1和str2,例如

void StringCopy(char *str1, char *str2);

那么我們很難搞清楚究竟是把str1拷貝到str2中,還是剛好倒過來。

可以把參數名字起得更有意義,如叫strSource和strDestination。這樣從名字上就可以看出應該把strSource拷貝到strDestination。

還有一個問題,這兩個參數那一個該在前那一個該在后?參數的順序要遵循程序員的習慣。一般地,應將目的參數放在前面,源參數放在后面。

如果將函數聲明為:

void StringCopy(char *strSource, char *strDestination);

別人在使用時可能會不假思索地寫成如下形式:

char str[20];

StringCopy(str, “Hello World”); // 參數順序顛倒

l 【規則6-1-3】如果參數是指針,且僅作輸入用,則應在類型前加const,以防止該指針在函數體內被意外修改。

例如:

void StringCopy(char *strDestination,const char *strSource);

l 【規則6-1-4】如果輸入參數以值傳遞的方式傳遞對象,則宜改用“const &”方式來傳遞,這樣可以省去臨時對象的構造和析構過程,從而提高效率。

2 【建議6-1-1】避免函數有太多的參數,參數個數盡量控制在5個以內。如果參數太多,在使用時容易將參數類型或順序搞錯。

2 【建議6-1-2】盡量不要使用類型和數目不確定的參數。

C標準庫函數printf是采用不確定參數的典型代表,其原型為:

int printf(const chat *format[, argument]…);

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

6.2 返回值的規則
l 【規則6-2-1】不要省略返回值的類型。

C語言中,凡不加類型說明的函數,一律自動按整型處理。這樣做不會有什么好處,卻容易被誤解為void類型。

C++語言有很嚴格的類型安全檢查,不允許上述情況發生。由于C++程序可以調用C函數,為了避免混亂,規定任何C++/ C函數都必須有類型。如果函數沒有返回值,那么應聲明為void類型。

l 【規則6-2-2】函數名字與返回值類型在語義上不可沖突。

違反這條規則的典型代表是C標準庫函數getchar。

例如:

char c;

c = getchar();

if (c == EOF)

按照getchar名字的意思,將變量c聲明為char類型是很自然的事情。但不幸的是getchar的確不是char類型,而是int類型,其原型如下:

int getchar(void);

由于c是char類型,取值范圍是[-128,127],如果宏EOF的值在char的取值范圍之外,那么if語句將總是失敗,這種“危險”人們一般哪里料得到!導致本例錯誤的責任并不在用戶,是函數getchar誤導了使用者。

l 【規則6-2-3】不要將正常值和錯誤標志混在一起返回。正常值用輸出參數獲得,而錯誤標志用return語句返回。

回顧上例,C標準庫函數的設計者為什么要將getchar聲明為令人迷糊的int類型呢?他會那么傻嗎?

在正常情況下,getchar的確返回單個字符。但如果getchar碰到文件結束標志或發生讀錯誤,它必須返回一個標志EOF。為了區別于正常的字符,只好將EOF定義為負數(通常為負1)。因此函數getchar就成了int類型。

我們在實際工作中,經常會碰到上述令人為難的問題。為了避免出現誤解,我們應該將正常值和錯誤標志分開。即:正常值用輸出參數獲得,而錯誤標志用return語句返回。

函數getchar可以改寫成 BOOL GetChar(char *c);

雖然gechar比GetChar靈活,例如 putchar(getchar()); 但是如果getchar用錯了,它的靈活性又有什么用呢?

2 【建議6-2-1】有時候函數原本不需要返回值,但為了增加靈活性如支持鏈式表達,可以附加返回值。

例如字符串拷貝函數strcpy的原型:

char *strcpy(char *strDest,const char *strSrc);

strcpy函數將strSrc拷貝至輸出參數strDest中,同時函數的返回值又是strDest。這樣做并非多此一舉,可以獲得如下靈活性:

char str[20];

int length = strlen( strcpy(str, “Hello World”) );

2 【建議6-2-2】如果函數的返回值是一個對象,有些場合用“引用傳遞”替換“值傳遞”可以提高效率。而有些場合只能用“值傳遞”而不能用“引用傳遞”,否則會出錯。

例如:

class String

{…

// 賦值函數

String & operate=(const String &other);

// 相加函數,如果沒有friend修飾則只許有一個右側參數

friend String operate+( const String &s1, const String &s2);

private:

char *m_data;

}

String的賦值函數operate = 的實現如下:

String & String::operate=(const String &other)

{

if (this == &other)

return *this;

delete m_data;

m_data = new char[strlen(other.data)+1];

strcpy(m_data, other.data);

return *this; // 返回的是 *this的引用,無需拷貝過程

}

對于賦值函數,應當用“引用傳遞”的方式返回String對象。如果用“值傳遞”的方式,雖然功能仍然正確,但由于return語句要把 *this拷貝到保存返回值的外部存儲單元之中,增加了不必要的開銷,降低了賦值函數的效率。例如:

String a,b,c;

a = b; // 如果用“值傳遞”,將產生一次 *this 拷貝

a = b = c; // 如果用“值傳遞”,將產生兩次 *this 拷貝

String的相加函數operate + 的實現如下:

String operate+(const String &s1, const String &s2)

{

String temp;

delete temp.data; // temp.data是僅含‘亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

国产成人精品电影久久久| 国产精品色午夜在线观看| 亚洲欧美制服另类日韩| 一二美女精品欧洲| 国产在线观看一区二区三区| 免费99精品国产自在在线| 国产香蕉精品视频一区二区三区| 欧美日韩国产综合视频在线观看中文| 久久久久久久久久久免费精品| 韩国三级电影久久久久久| 国产一区二区三区在线播放免费观看| 久久精品一区中文字幕| 久久久久久国产精品美女| 久久亚洲精品视频| 亚洲电影免费观看高清完整版在线观看| 久久成年人免费电影| 欧美老少配视频| 久久精品国产91精品亚洲| 一本色道久久综合亚洲精品小说| 日韩成人中文字幕| 国产午夜精品免费一区二区三区| 成人国产精品久久久久久亚洲| 国产精品免费一区二区三区都可以| 97在线视频免费看| 中文字幕亚洲无线码在线一区| 国产精品高清网站| 国产999视频| 国产欧美日韩免费看aⅴ视频| 俺去亚洲欧洲欧美日韩| 91色琪琪电影亚洲精品久久| 一区二区三区高清国产| 亚洲黄页视频免费观看| www国产精品视频| 一本久久综合亚洲鲁鲁| 欧美重口另类videos人妖| 亚洲精品美女免费| 国产一区二区欧美日韩| 91麻豆国产精品| 欧美视频在线观看免费网址| 国产精品国内视频| 亚洲天堂久久av| 日韩中文字幕久久| 久久精品国产久精国产一老狼| 久久精品国产一区二区电影| 日韩精品视频在线免费观看| 欧美性猛交xxxx免费看久久久| 亚洲福利视频网站| 97在线精品国自产拍中文| 中文字幕在线看视频国产欧美| 91欧美精品成人综合在线观看| 欧美在线播放视频| 最新的欧美黄色| 久久久欧美一区二区| 人体精品一二三区| 日韩成人在线视频| 亚洲人成网站999久久久综合| 国产成人久久久精品一区| 久久久久久久久久婷婷| 日韩专区在线播放| 亚洲福利视频免费观看| 欧美成人免费全部| 成人在线视频网站| 综合网日日天干夜夜久久| 日韩美女免费视频| 国产一区在线播放| 国产精品美女久久| 国产成人免费av电影| 日韩一区二区精品视频| 亚洲国产三级网| 国产成人福利视频| 亚洲精品美女久久久| 日韩一区在线视频| 久久人人爽人人爽人人片亚洲| 97在线视频免费播放| 中文字幕一区日韩电影| 亚洲成人教育av| 欧美亚洲成人网| 欧美高清第一页| 福利精品视频在线| 中文字幕精品在线| 久久久亚洲精选| 成人久久久久爱| 激情成人在线视频| 91亚洲人电影| 欧美肥臀大乳一区二区免费视频| 欧美日韩成人精品| 成人h视频在线观看播放| 久久综合九色九九| 亚洲福利视频久久| 国产精品女人久久久久久| 蜜臀久久99精品久久久无需会员| 精品中文字幕乱| 91视频-88av| **欧美日韩vr在线| xxx欧美精品| 亚洲国产精久久久久久久| 亚洲精品黄网在线观看| 深夜精品寂寞黄网站在线观看| 精品中文字幕视频| 欧美专区国产专区| 日韩久久免费电影| 国产精品三级网站| 国产精品www| 国产精品看片资源| 国产91精品久久久久久久| 日韩精品久久久久久久玫瑰园| 中文字幕日韩欧美在线| 精品少妇v888av| 最好看的2019的中文字幕视频| 久久天天躁夜夜躁狠狠躁2022| 欧美国产第一页| 91av视频导航| 欧美性生活大片免费观看网址| 国产成人精品视| 国产成人亚洲综合青青| 亚洲另类图片色| 一区二区三区天堂av| 97视频在线观看免费| 亚洲欧美一区二区三区在线| 久久国产天堂福利天堂| 国产精品久久久91| 日本成人激情视频| 欧美三级欧美成人高清www| 久久91精品国产| 久久91精品国产91久久久| 日韩最新免费不卡| 一区二区欧美久久| 亚洲精品电影网在线观看| 国外日韩电影在线观看| 国产偷亚洲偷欧美偷精品| 亚洲精品国产品国语在线| 欧美理论电影网| 日韩欧美福利视频| www.久久久久久.com| 欧美韩国理论所午夜片917电影| 日韩一区二区三区xxxx| 国产精品久久久久77777| 91精品视频观看| 在线观看欧美视频| 久久天天躁狠狠躁老女人| 91黑丝在线观看| 一级做a爰片久久毛片美女图片| 国产一区二区三区在线免费观看| 久久久久久av| 亚洲欧美在线免费观看| 91精品国产九九九久久久亚洲| 亚洲精品视频在线观看视频| 欧美成人午夜影院| 日韩一区二区在线视频| 日韩av在线资源| 国产精品∨欧美精品v日韩精品| 国产精品扒开腿做| 久久成人在线视频| y97精品国产97久久久久久| xxxxx91麻豆| 国产精品久久久久久久9999| 国产亚洲精品久久久久久牛牛| 亚洲国产黄色片| 日韩av中文字幕在线播放| 一区二区三欧美| 国产亚洲欧美一区| 欧美精品videosex牲欧美| 欧美做受高潮1| 国产日韩在线观看av|