06/04/2021, 14:47

Hiểu hơn về tham trị và tham chiếu trong C++ - Học C++ căn bản và nâng cao

Trong bài này mình sẽ giúp bạn hiểu hơn về tham trị và tham chiếu trong C++, đây là hai cách truyền tham số cho hàm C++ mà bạn nhất định phải biết. Trong C++ hỗ trợ cho chúng ta 2 cách gọi hàm đó là tham trị (call by value) và tham chiếu (call by reference). Cả hai đều có chung mục đích là truyền ...

Trong bài này mình sẽ giúp bạn hiểu hơn về tham trị và tham chiếu trong C++, đây là hai cách truyền tham số cho hàm C++ mà bạn nhất định phải biết.

Trong C++ hỗ trợ cho chúng ta 2 cách gọi hàm đó là tham trị (call by value) và tham chiếu (call by reference). Cả hai đều có chung mục đích là truyền dữ liệu vào hàm, nhưng về tính chất thì có sự khác biệt rất rõ ràng.

callbyvalue callbyreference in c png

Thuật ngữ modified trong hình trên có ý nghĩa là có thể thay đổi giá trị cho tham số Original value truyền vào. Vậy, khi tham số được gọi theo tham trị thì những thay đổi của tham số đó trong hàm sẽ không ảnh hưởng đến giá trị gốc của biến khi kết thúc hàm. Còn khi gọi theo kiểu tham trị thì có thay đổi.

Để biết thêm chi tiết chúng ta sẽ cùng tìm hiểu trong nội dung sau nhé.

1. Gọi hàm kiểu tham trị trong C++

Tham trị trong C++ không làm thay đổi giá trị của tham số thực tế được truyền vào hàm. Tức là khi truyền giá trị của tham số thực tế vào hàm, thì giá trị của tham số thực tế sẽ được copy cho tham số hình thức của hàm, giá trị của tham số hình thức và tham số thực tế ở hai bộ nhớ khác nhau, vì vậy thay đổi giá trị bên trong hàm không làm thay đổi giá trị của tham số thực tế truyền vào.

Ví dụ: Chúng ta cùng xem một ví dụ đơn giản về tham trị trong C++ như sau:

Ví dụ
#include <iostream>  
using namespace std; 

void Show(int i)  
{  
    i = 15;  
    cout << "Bien i ben trong ham, i = " << i << endl;
}

int main()  
{  
    int i = 1;  
    cout << "Truoc khi truyen bien i vao ham, i = " << i << endl;
    Show(i);  
    cout << "Sau khi truyen bien i vao ham, i = " << i << endl;
    return 0;  
}  

Và kết quả sau khi thực thi đoạn code trên:

call by value ex1 JPG

Ban đầu giá trị của i = 1, mình truyền i vào trong hàm và hàm đó thay đổi giá trị của i thành 15. Tuy nhiên, sau khi kết thúc hàm thì biến i vẫn giữ nguyên giá trị ban đầu là bằng 1.

2. Gọi hàm kiểu tham chiếu trong C++

Tham chiếu trong C++ sẽ làm thay đổi giá trị của biến truyền vào hàm bởi vì chúng ta truyền vào địa chỉ của nó chứ không phải truyền giá trị vào.

Ở đây, địa chỉ của tham số thực tế được truyền vào hàm, vì vậy địa chỉ của tham số hình thức và tham số thực tế sẽ cùng địa chỉ trong bộ nhớ, cho nên khi thay đổi giá trị của tham số hình thức bên trong hàm, sẽ làm thay đổi giá trị gốc của tham số thực tế được truyền vào hàm.

Ví dụ: Chúng ta cùng xem một ví dụ đơn giản về tham chiếu trong C++, đó là hoán đổi 2 giá trị của 2 biến cho nhau.

Ví dụ
#include<iostream>  
using namespace std;

void swap(int *x, int *y)  
{  
    int swap;  
    swap=*x;  
    *x=*y;  
    *y=swap;  
}  

int main()   
{    
    int x;
    int y;
    x=2;
    y=3;
    cout << "Gia tri x truoc khi goi ham, x = " << x << endl;
    cout << "Gia tri y truoc khi goi ham, y = " << y << endl;
    swap(&x, &y);  
    cout << "Gia tri x sau khi goi ham, x = " << x << endl;
    cout << "Gia tri y sau khi goi ham, y = " << y << endl; 
    return 0;  
}

Và kết quả sau khi thực thi đoạn code trên:

call by ref ex1 JPG

Như bạn thấy, giá trị của biến x và y đã bị thay đổi sau khi truyền nó vào hàm swap.

3. Sự khác nhau giữa tham trị và tham chiếu trong C++ là gì?

Chúng ta cùng tổng hợp điểm khác nhau giữa tham trị và tham chiếu trong C++ như trong bảng sau:

4. Kết luận

Vậy là trong bài học hôm nay chúng ta đã tìm hiểu xong 2 cách gọi hàm thường sử dụng trong C++, đó là gọi hàm theo tham trị và gọi hàm theo tham chiếu. Tùy vào từng trường hợp mà bạn chọn cách gọi cho phù hợp nhé.

Nếu bạn nào muốn thay đổi giá trị của biến sau khi gọi hàm thì dùng cách gọi tham chiếu, nếu bạn nào chỉ lấy giá trị của biến để tính toán mà không cần thay đổi giá trị của biến thì dùng cách gọi tham trị.

Như vậy mình sẽ kết thúc bài học này tại đây nhé. Bài học tiếp theo mình sẽ học về đệ quy trong C++. Các bạn nhớ theo dõi nhé.

Trần Trung Dũng

15 chủ đề

2610 bài viết

Cùng chủ đề
0