String operator+(const String& s1, const String& s2) {
String temp;
// ... 組合 s1+s2 到 temp ...
return temp; // ✅ 值傳回:編譯器優化 (NRVO) 直接在呼叫端構建
}
若改引用傳回:return temp; 返回區域物件參考 → **懸空參考**,呼叫端 c = a + b 拿到垃圾,埋下禍根。
| 規則 | 核心內容 |
|---|---|
| 規則 6-3-1 | 入口:檢查參數有效性。善用 assert 防非法參數。 |
| 規則 6-3-2 | 出口:檢查 return 正確性與效能。 |
char* Func() {
char str[] = "hello"; // 棧上
return str; // ❌ 函數結束 str 銷毀
}
// ❌ 低效:建構 temp → 拷貝建構到返回值槽 → 析構 temp
String temp(s1 + s2);
return temp;
// ✅ 高效:臨時物件語法,編譯器直接在返回值槽構建 (NRVO/RVO)
return String(s1 + s2);
// 內建型別同理
return int(x + y); // ✅ 簡潔高效
// vs
int temp = x + y; return temp; // 多餘
static 區域變數即記憶體,慎用。
void* memcpy(void* pvTo, const void* pvFrom, size_t size) {
assert((pvTo != nullptr) && (pvFrom != nullptr)); // 僅 Debug 生效
byte* pbTo = (byte*)pvTo;
byte* pbFrom = (byte*)pvFrom;
while (size-- > 0) *pbTo++ = *pbFrom++;
return pvTo;
}
assert 是**巨集**,非函數,**零副作用**,Debug/Release 行為一致。assert = **呼叫端有錯**,非函數本身錯;助快速定位根因。