Một hàm viết dưới dạng đối tham chiếu sẽ đơn giản hơn rất nhiều so với đối con trỏ và giống với cách viết bình thường (truyền theo tham trị), trong đó chỉ có một khác biệt đó là các đối khai báo dưới dạng tham chiếu.
Để so sánh 2 cách sử dụng ta nhắc lại các điểm khi viết hàm theo con trỏ phải chú ý đến, đó là:
− Đối của hàm phải là con trỏ (ví dụ int *p)
− Các thao tác liên quan đến đối này trong thân hàm phải thực hiện tại nơi nó trỏ đến (ví dụ *p = …)
− Lời gọi hàm phải chuyển địa chỉ cho p (ví dụ &x). Hãy so sánh với đối tham chiếu, cụ thể:
• Đối của hàm phải là tham chiếu (ví dụ int &p)
• Các thao tác liên quan đến đối này phải thực hiện tại nơi nó trỏ đến, tức địa chỉ cần thao tác. Vì một thao tác trên biến tham chiếu thực chất là thao tác trên biến được nó tham chiếu nên trong hàm chỉ cần viết p trong mọi thao tác (thay vì *p như trong con trỏ)
• Lời gọi hàm phải chuyển địa chỉ cho p. Vì bản thân p khi tham chiếu đến biến nào thì sẽ chứa địa chỉ của biến đó, do đó lời gọi hàm chỉ cần ghi tên biến, ví dụ x (thay vì &x như đối với dẫn trỏ).
Tóm lại, đối với hàm viết theo tham chiếu chỉ thay đổi ở đối (là các tham chiếu) còn lại mọi nơi khác đều viết đơn giản như cách viết truyền theo tham trị.
Ví dụ 7 : Đổi giá trị 2 biến void swap(int &x, int &y) {
int t = x; x = y; y = t; }
và lời gọi hàm cũng đơn giản như trong truyền đối theo tham trị. Ví dụ: int a = 5, b = 3;
swap(a, b); cout << a << b;
Bảng dưới đây minh hoạ tóm tắt 3 cách viết hàm thông qua ví dụ đổi biến ở trên.
Tham trị Tham chiếu Dẫn trỏ
Khai báo đối void swap(int x, int y) void swap(int &x, int &y) void swap(int *x, int *y) Câu lệnh t = x; x = y; y = t; t = x; x = y; y = t; t = *x; *x = *y; *y = t; Lời gọi swap(a, b); swap(a, b); swap(&a, &b);
Tác dụng a, b không thay đổi a, b có thay đổi a, b có thay đổi