Tham chiếu (Reference Parameter) cho phép hàm truy cập và sửa đổi trực tiếp biến gốc được truyền vào. Còn gọi là Call by Reference (gọi bằng tham chiếu).
Cú pháp
// Khai báo hàm nhận tham chiếu
void swap(int& x, int& y); // Dấu & sau kiểu dữ liệu
// Định nghĩa
void swap(int& x, int& y) {
int temp = x;
x = y;
y = temp;
}
Ví dụ hoàn chỉnh: Hoán đổi hai số
#include <iostream>
using namespace std;
// Khai báo
void swap(int& x, int& y);
int main() {
int a = 100;
int b = 200;
cout << "Truoc swap: a = " << a << ", b = " << b << endl;
swap(a, b); // Truyền bằng tham chiếu
cout << "Sau swap: a = " << a << ", b = " << b << endl;
return 0;
}
// Định nghĩa
void swap(int& x, int& y) {
int temp = x;
x = y; // Sửa đổi biến gốc a
y = temp; // Sửa đổi biến gốc b
}
Kết quả
Truoc swap: a = 100, b = 200 Sau swap: a = 200, b = 100
So sánh: Truyền giá trị vs Truyền tham chiếu
| Đặc điểm | Call by Value | Call by Reference |
|---|---|---|
| Cú pháp | void f(int x) | void f(int& x) |
| Biến trong hàm | Bản sao (copy) | Biến gốc (alias) |
| Sửa đổi ảnh hưởng gốc? | Không | Có |
| Chi phí copy | Có (tốn cho đối tượng lớn) | Không |
| Mặc định C++ | Có | Cần thêm & |
Tham chiếu const (Const Reference)
Dùng để tránh copy đối tượng lớn mà không cho phép sửa đổi:
void print(const string& s) { // Không copy string, không cho sửa
cout << s << endl;
}
void modify(string& s) { // Cho phép sửa
s += " modified";
}
Lưu ý quan trọng
- Tham chiếu phải được khởi tạo ngay khi khai báo (trong tham số hàm: lúc gọi)
- Không thể gán lại tham chiếu trỏ đến biến khác
- Không có mảng tham chiếu, con trỏ tới tham chiếu
- Trả về tham chiếu từ hàm: Chỉ trả về biến static/global/member, không trả về biến cục bộ
Ví dụ lỗi: Trả về tham chiếu biến cục bộ
int& bad_func() {
int x = 10;
return x; // LỖI: x bị hủy khi hàm kết thúc → dangling reference
}
Ứng dụng thực tế
- Hàm sửa đổi đối số (swap, sort, parse...)
- Tránh copy đối tượng lớn (string, vector, class)
- Toán tử nạp chồng (operator=, operator+, operator<<...)
- Range-based for loop:
for (auto& x : v)để sửa đổi phần tử