程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> vc教程 >> 高質量C++/C編程指南-第6章-函數設計(2)

高質量C++/C編程指南-第6章-函數設計(2)

編輯:vc教程

由於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是僅含‘\0’的字符串

temp.data = new char[strlen(s1.data) + strlen(s2.data) +1];

strcpy(temp.data, s1.data);

strcat(temp.data, s2.data);

return temp;

}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved