| Pass-by-value | Pass-by-reference (&) | Pass-by-pointer (*) | |
|---|---|---|---|
| Copy | Luôn copy | Không copy | Không copy (copy địa chỉ) |
| Null | Không thể null | Không thể null | Có thể null |
| Reassign | Không ảnh hưởng caller | Không reassign target | Có thể trỏ chỗ khác |
| Dùng | Kiểu nhỏ (int, bool) | Object lớn đọc/sửa | Optional arg, array |
cpp
void byValue(int x) { x = 100; } // không ảnh hưởng caller
void byRef(int& x) { x = 100; } // sửa biến gốc
void byPtr(int* x) { *x = 100; } // sửa qua dereferencing
int n = 5;
byValue(n); // n = 5
byRef(n); // n = 100
byPtr(&n); // n = 100Quy tắc thực tế:
- Kiểu nhỏ (int, char, bool, raw pointer): pass-by-value.
- Object lớn, chỉ đọc: const T&.
- Cần sửa: T&.
- Optional hoặc array: pointer.
| Pass-by-value | Pass-by-reference (&) | Pass-by-pointer (*) | |
|---|---|---|---|
| Copy | Always copies | No copy | No copy (copies address) |
| Null | Cannot be null | Cannot be null | Can be null |
| Reassign | No effect on caller | Cannot retarget | Can point elsewhere |
| Use case | Small types (int, bool) | Large objects read/modify | Optional arg, array |
cpp
void byValue(int x) { x = 100; } // no effect on caller
void byRef(int& x) { x = 100; } // modifies original
void byPtr(int* x) { *x = 100; } // modifies via dereferencing
int n = 5;
byValue(n); // n = 5
byRef(n); // n = 100
byPtr(&n); // n = 100Practical rules:
- Small types (int, char, bool, raw pointer): pass-by-value.
- Large objects, read-only: const T&.
- Need to modify: T&.
- Optional argument or array: pointer.