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

C++ 與 Java 類別參考機制差異:參考、複製、函數傳遞與回傳

     編輯:VC 教學

核心差異速覽

特性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,區分淺/深複製

C++ 詳細行為

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; }        // 危險:回傳區域物件參考

Java 詳細行為


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。

實務啟示

  • C++ 需明確決定值 vs 參考,設計複製建構子、移動語意 (C++11)、智慧指標管理生命週期。
  • Java 開發者轉 C++ 易忘記複製成本;C++ 開發者轉 Java 易誤以為能修改呼叫端參考。
  • Java clone() 預設淺複製,深複製需遞迴複製所有可變欄位,並實作 Cloneable 介面 (標記介面)。
  • C++ 回傳區域物件參考是 UB;Java 回傳區域物件參考完全安全 (GC)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved