Đây là câu hỏi về kiểu tham chiếu hằng (const reference) so với kiểu giá trị (value type).
int (Giá trị)
- Kiểu dữ liệu nguyên bản (fundamental type)
- Truyền tham số: Copy giá trị
- Hàm làm việc trên bản sao, không ảnh hưởng biến gốc
- Phù hợp cho kiểu nhỏ (int, char, double...)
const int& (Tham chiếu hằng)
- Tham chiếu (
&) đếnintvới qualifierconst - Truyền tham số: Không copy, bind trực tiếp đến đối tượng gốc
- Hàm không thể sửa đổi đối tượng qua tham chiếu này
- Phù hợp cho kiểu lớn (class, struct) hoặc khi không muốn copy
So sánh chi tiết
| Đặc điểm | int | const int& |
|---|---|---|
| Cơ chế truyền | Pass by value (copy) | Pass by reference (alias) |
| Chi phí | Copy 4/8 bytes | Chỉ truyền địa chỉ (thường 8 bytes) |
| Sửa đổi trong hàm | Ảnh hưởng bản sao | CẤM (compile error) |
| Binding với temporary | Copy temporary | Kéo dài lifetime của temporary |
| Binding với literal | OK | OK (tạo temporary) |
| Binding với biểu thức | OK (tính giá trị) | OK (tạo temporary) |
Ví dụ: Binding với temporary
void func_val(int x) { /* ... */ }
void func_ref(const int& x) { /* ... */ }
int main() {
func_val(10); // OK: copy giá trị 10
func_ref(10); // OK: bind đến temporary int(10)
func_val(5 + 3); // OK: tính 8, copy
func_ref(5 + 3); // OK: tạo temporary 8, bind
double d = 3.14;
func_val(d); // OK: ép kiểu double->int, copy
func_ref(d); // LỖI: không bind double& vào const int&
// Cần: func_ref(static_cast<int>(d));
}
const int& vs int const&
Hai cách viết tương đương nhau (cách đọc từ phải sang trái):
const int&= reference to const intint const&= reference to const int
Lưu ý về "const int&" trong tham số hàm
// Tốt cho kiểu lớn
void process(const BigObject& obj); // Tránh copy
// KHÔNG cần thiết cho kiểu nhỏ (int, double, pointer)
void bad(int x); // Tốt hơn
void bad2(const int& x); // Thậm chí chậm hơn do dereference
Tóm tắt
int: Giá trị, copy, phù hợp kiểu nhỏconst int&: Tham chiếu chỉ đọc, không copy, kéo dài temporary lifetime, phù hợp kiểu lớnconst int&==int const&- Tránh
const int&cho kiểu cơ bản nhỏ (int, char, double, pointer)