| 特性 | C++ | Java |
|---|---|---|
| 物件宣告 | T a; 直接實例化 (棧上) | T a; 僅宣告參考 (null),需 new T() 實例化 |
| 參考宣告 | T &b = a; 別名,編譯期綁定 | 所有非基本型別變數皆為參考 (Handle) |
指派 T b = a; | 呼叫複製建構子,產生新物件 (深複製) | 複製參考值,a、b 指向同一物件 |
| 函數參數傳遞 | 預設值傳遞 (複製);可用 T& 參考傳遞 | 永遠傳遞參考值 (Call by Sharing),不可變更呼叫端參考本身 |
| 回傳值 | 預設複製回傳;T& 回傳參考 (勿回傳區域物件) | 回傳參考值,區域物件回傳安全 (GC 管理) |
| Swap 實作 | 可用參考交換實際物件 | 無法交換呼叫端變數指向,只能交換物件內部狀態 |
| 深複製 | 自訂複製建構子/賦值運算子 | 實作 clone() + Cloneable,區分淺/深複製 |
class T { public: int x; T(int v):x(v) {} };
void FuncVal(T p) { p.x = 20; } // 複製
void FuncRef(T& p) { p.x = 30; } // 參考
T a(10);
FuncVal(a); // a.x 仍為 10
FuncRef(a); // a.x 變 30
T& GetRef() { static T s(99); return s; } // 安全:static 生命週期
T& BadRef() { T t(88); return t; } // 危險:回傳區域物件參考
class T { int x; T(int v) { x = v; } }
void func(T p) {
p.x = 20; // 修改物件內容:影響呼叫端
p = new T(30); // 修改區域參考:不影響呼叫端
}
T a = new T(10);
func(a); // a.x == 20, a 仍指向原物件
// Swap 無法寫成:
void swap(T a, T b) { T t = a; a = b; b = t; } // 僅交換區域參考
// 必須改為交換內部欄位或使用容器包裹
C++:變數即物件本身 (值語義),參考是別名。
Java:變數是參考 (Handle/Pointer),物件在 Heap,參考在 Stack。
clone() 預設淺複製,深複製需遞迴複製所有可變欄位,並實作 Cloneable 介面 (標記介面)。