Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Tham chiếu (Reference Parameters) trong C++

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ểmCall by ValueCall by Reference
Cú phápvoid f(int x)void f(int& x)
Biến trong hàmBản sao (copy)Biến gốc (alias)
Sửa đổi ảnh hưởng gốc?KhôngCó
Chi phí copyCó (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ử