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

高品質 C++/C 程式設計指南 第 6 章 (二):返回值設計鐵律與 getchar 經典反面教材

     編輯:關於C++

6.2 返回值規則

規則 6-2-1:不可省略返回型別

C 允許隱式 int,C++ **嚴禁**。無返回值必寫 void。

規則 6-2-2:函數名與返回型別語義不可衝突

**反面教材**:getchar。


char c;
c = getchar(); // 直覺以為回傳 char
if (c == EOF) ... // EOF 通常為 -1 (int)

int getchar(void); // 真實原型:int!

原因:正常回傳字元,但需區分 EOF/錯誤,**只能擴大返回型別容納標誌值**。

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

正常值用輸出參數,錯誤標誌用返回值。


// 改良版
BOOL GetChar(char* c); // 返回 TRUE/FALSE 表成功失敗,字元經 c 輸出

// 原版靈活但危險
putchar(getchar()); // 合法但誤用後果嚴重

建議 6-2-1:為靈活性附加返回值 (如鏈式表達)


char* strcpy(char* dest, const char* src); // 返回 dest
int len = strlen(strcpy(buf, "Hello")); // 一行完成複製+取長

建議 6-2-2:返回物件時的傳遞方式抉擇

賦值運算子:引用傳回 (支援鏈式、避免拷貝)


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;
    // ... 組合 ...
    return temp; // ✅ 值傳回,編譯器 NRVO 優化
}

引用傳回 temp → 區域物件銷毀後懸空,**嚴禁**。

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