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

來源:互聯網
上載者:User

由於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;

}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.