首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

C/C++ 函式設計精要(二):getchar 陷阱、回傳值設計藝術與鏈式運算支援

     編輯:VC 教學

getchar 的型別陷阱深度剖析

getchar 宣告為 int getchar(void) 而非 char,原因在於需區分正常字元與 EOF(通常為 -1)。若回傳 char,EOF 可能超出 char 範圍(-128~127),導致 if (c == EOF) 永遠失敗。這是函式設計者誤導使用者的經典案例,責任不在使用者。

規則 6-2-3:正常值與錯誤標誌分離回傳

正常值用輸出參數取得,錯誤標誌用 return 回傳。將 getchar 改為:


BOOL GetChar(char* c);

雖 getchar 靈活(可 putchar(getchar())),但用錯時靈活性無補於事。

建議 6-2-1:為靈活性可附加回傳值支援鏈式運算

strcpy 原型:


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

將來源複製至輸出參數 strDest,同時回傳 strDest,獲得靈活性:


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

建議 6-2-2:回傳物件時,視情況以參考替代傳值提升效率

案例一:指派運算子 → 必須回傳參考


class String {
    String& operator=(const String& other);
    char* m_data;
};

String& String::operator=(const String& other) {
    if (this == &other) return *this;
    delete[] m_data;
    m_data = new char[strlen(other.m_data) + 1];
    strcpy(m_data, other.m_data);
    return *this; // 回傳參考,無複製開銷
}

若改傳值,a = b 產生 1 次複製,a = b = c 產生 2 次,效率大幅下降。

案例二:加法運算子 → 必須傳值


String operator+(const String& s1, const String& s2) {
    String temp;
    delete[] temp.m_data;
    temp.m_data = new char[strlen(s1.m_data) + strlen(s2.m_data) + 1];
    strcpy(temp.m_data, s1.m_data);
    strcat(temp.m_data, s2.m_data);
    return temp; // 傳值:回傳區域物件 temp 的副本
}

若改回傳參考 String&,則回傳指向區域物件 temp 的參考。temp 函式結束時銷毀,導致懸空參考:


c = a + b; // a+b 不回傳期望值,c 什麼也得不到,埋下隱患

鐵律:回傳區域物件**必須傳值**;回傳既存物件(如 *this)宜傳參考。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved