Call by value & Call by reference trong C++

Khi học lập trình C++, một tính chất không thể không nhắc đến chính là khả năng truyền tham chiếu và truyền tham trị. Trong bài viết dưới đây hãy cùng eLib.VN tìm hiểu xem chúng là gì, cách sử dụng và khi nào nên sử dụng chúng.

Call by value & Call by reference trong C++

1. Phương thức call by value trong C++ 

Phương thức call by value trong C++ của các đối số truyền vào một hàm sao chép giá trị thực của một đối số vào tham số chính thức của hàm. Trong trường hợp này, các thay đổi được thực hiện cho tham số bên trong hàm không ảnh hưởng đến đối số.

Theo mặc định, lập trình C++ sử dụng call by value để chuyển đối số. Nói chung, nó có nghĩa là mã trong một hàm không thể thay đổi các đối số được sử dụng để gọi hàm. Hãy xem xét hàm swap() như sau.

#include <iostream>

using namespace std;

/* khai bao prototype */
void swap(int x, int y);
  
int main() {
    // dinh nghia cac bien local
    int a = 100;
    int b = 200;
  
    cout << "Truoc swap, gia tri cua a : " << a << endl;
    cout << "Truoc swap, gia tri cua b : " << b << endl;
  
    // goi ham swap() de hoan doi cac gia tri
    swap(a, b);
  
    cout << "Sau swap, gia tri cua a : " << a << endl;
    cout << "Sau swap, gia tri cua b : " << b << endl;
  
    return 0;
}

/*
 * ham hoan doi cac gia tri
 */
void swap(int x, int y) {
    int temp;

    temp = x;
    x = y;
    y = temp;

    return;
}

Kết quả:

Truoc swap, gia tri cua a : 100
Truoc swap, gia tri cua b : 200
Sau swap, gia tri cua a : 100
Sau swap, gia tri cua b : 200

Kết quả trên cho thấy rằng không có thay đổi trong các giá trị, mặc dù chúng đã được thay đổi bên trong hàm.

2. Phương thức call by reference trong C++

Phương thức call by reference trong C++ của các đối số truyền cho một hàm sao chép địa chỉ của một đối số vào tham số chính thức. Bên trong hàm, địa chỉ được sử dụng để truy cập đối số thực tế được sử dụng trong cuộc gọi hàm. Nó có nghĩa là những thay đổi được thực hiện cho tham số ảnh hưởng đến đối số đã truyền.

Để chuyển một giá trị theo tham chiếu, các con trỏ đối số được chuyển tới các hàm giống như bất kỳ giá trị nào khác. Vì vậy, bạn cần phải khai báo các tham số hàm như các kiểu con trỏ như trong hàm swap(), hoán đổi các giá trị của hai biến số nguyên được trỏ tới, bởi các đối số của chúng. Ví dụ:

#include <iostream>

using namespace std;

/* khai bao prototype */
void swap(int *x, int *y);
  
int main() {
    // dinh nghia cac bien local
    int a = 100;
    int b = 200;
  
    cout << "Truoc swap, gia tri cua a : " << a << endl;
    cout << "Truoc swap, gia tri cua b : " << b << endl;
  
    // goi ham swap() de hoan doi cac gia tri
    swap(&a, &b);
  
    cout << "Sau swap, gia tri cua a : " << a << endl;
    cout << "Sau swap, gia tri cua b : " << b << endl;
  
    return 0;
}

/*
 * ham hoan doi cac gia tri
 */
void swap(int *x, int *y) {
    int temp;

    temp = *x;
    *x = *y;
    *y = temp;

    return;
}
Kết quả:
Truoc swap, gia tri cua a : 100
Truoc swap, gia tri cua b : 200
Sau swap, gia tri cua a : 200
Sau swap, gia tri cua b : 100

Kết quả cho thấy sự thay đổi bên trong hàm swap() cũng đã phản ánh bên ngoài hàm, không giống như call by value mà các thay đổi không phản ánh bên ngoài hàm.

3. So sánh tham trị và tham chiếu

Hãy cùng nhìn lại bảng sau để thấy được sự khác biệt giữa truyền tham chiếu và truyền tham trị.

STT Truyền tham trị Truyền tham chiếu
1 Một bản sao giá trị của biến được truyền vào hàm Một địa chỉ ô nhớ của biến được truyền vào hàm
2 Những thay đổi trong hàm được giới hạn trong hàm, không làm thay đổi giá trị của biến được truyền vào hàm Những thay đổi không chỉ giới hạn trong hàm mà còn làm thay đổi giá trị của biến được truyền vào hàm nếu trong hàm cũng làm thay đổi giá trị biến đó
3 Đối số trong hàm và tham số chính thức được tạo tại hai vị trí bộ nhớ khác nhau Đối số trong hàm và tham số chính thức được tạo tại cùng một vị trí bộ nhớ

Trên đây là bài viết của eLib.VN về Truyền Tham Chiếu Và Truyền Tham Trị Trong C++. Hy vọng qua bài viết của mình, các bạn đã có cái nhìn rõ ràng hơn về truyền tham chiếu và tham trị cũng như sự khác nhau và cách sử dụng của chúng trong thực tế. Chúc các bạn thành công trên con đường lập trình của mình.

Ngày:27/10/2020 Chia sẻ bởi:Hoang Oanh Nguyen

CÓ THỂ BẠN QUAN TÂM