Java 僅支援值傳遞(基本型別傳值,物件傳參考的值)。C++ 支援三種:值傳遞、指標傳值(模擬引用)、引用傳遞(真正別名)。
傳遞數值副本,函數內修改不影響外部。
傳遞「參考的副本」(記憶體地址值)。
// Java 範例
void swap(Integer a, Integer b) { // 僅交換區域參考
Integer t = a; a = b; b = t;
}
void change(StringBuffer sb) { sb.append(" modified"); } // 修改物件內容,外部可見
建立參數副本(含基本型別、結構體、類別物件)。修改副本不影響原物件。
傳遞指標副本。可透過 *ptr 修改指向物件,但無法修改呼叫端指標本身。
void test(int* ptr) { *ptr = 20; } // 修改值
int i = 10; test(&i); // i 變 20
參數成為原變數別名。函數內操作直接作用於原變數,語法最直觀、效率最高。
void swap(int& a, int& b) { int t=a; a=b; b=t; } // 真正交換
int x=1, y=2; swap(x, y); // x=2, y=1
| 語言 | 基本型別 | 物件/結構體 | 可否修改實參變數本身 |
|---|---|---|---|
| Java | 值傳遞 | 參考值傳遞 | 不可 |
| C++ | 值/指標/引用 | 值/指標/引用 | 引用/指標可 |