Trong bài trước, chúng ta đã được biết đến khái niệm và cách thức sử dụng hàm. Đối với những hàm có tham số hình thức đầu vào, khi thực hiện phải được truyền giá trị thực cho các tham số ngày. Có 2 cách truyền tham số: truyền bằng trị và truyền bằng biến.
Truyền tham số bằng trị
Trong C++, mặc định là truyền tham số theo giá trị (một số tài liệu gọi là “truyền tham trị”). Có nghĩa là các giá trị thực (tham số thực) không bị thay đổi giá trị khi truyền cho các tham số hình thức sau khi thoát khỏi hàm.
Ví dụ minh hoạ truyền tham trị
Để hiểu rõ hơn, chúng ta hãy cùng làm và quan sát ví dụ sau:
Trước khi đọc tiếp, mình muốn bạn hãy cứ nhập lại đoạn code trên và chạy thử để thấy kết quả. Ghi nhớ lại kết quả bạn chạy được, sau đó hãy đọc tiếp thì bạn sẽ dễ hiểu hơn.
Phân tích
Cách chương trình hoạt động:
- Đầu tiên, thực hiện việc nhập giá trị cho 02 biến a và b (từ dòng 12 đến 16).
- Sau đó, gọi hàm hoanVi (dòng 18) để thực hiện hoán vị giá trị cho 02 biến a và b.
- Sau khi hoanVi xong, chúng ta sẽ in giá trị của a và b ra màn hình để kiểm tra.
Nếu bạn làm đúng theo những gì ở trên, chắc chắn khi chạy thử bạn sẽ có kết quả thế này:
- Ví dụ nhập giá trị cho a và b như sau:Nhap gia tri cho a: 11
Nhap gia tri cho b: 10 - Sau khi thực hiện, kết quả nhận được sẽ là:Gia tri cua a la 11
Gia tri cua b la 10
Như bạn thấy, kết quả không hề có sự thay đổi nào cả. Ban đầu nhập giá trị cho a là 11 thì sau khi thực hiện hàm hoanVi, a vẫn mang giá trị là 11 (tương tự như vậy cho b). Lý do là vì chúng ta chỉ truyền giá trị thực cho 02 biến a và b chứ không truyền địa chỉ. Do đó các sự thay đổi trong hàm này (hoán vị 2 số) không thể ghi lại được. Vì vậy mà giá trị của a và b vẫn được giữ nguyên sau khi thực hiện xong hàm hoanVi.
Truyền tham số bằng biến
Theo thống kê, đa số các trường hợp truyền tham số cho hàm trong C++ là truyền tham trị. Nhưng trong một số trường hợp đặc biệt (chẳng hạn như ví dụ trên), việc truyền tham trị sẽ không mang lại kết quả như mong muốn. Bởi những trường hợp này chúng ta thường mong muốn giá trị mới sau khi thực hiện hàm sẽ được lưu giữ mang ra bên ngoài hàm. Lúc này, bạn sẽ cần truyền tham số theo cách khác. Đó là truyền tham số bằng biến (hay còn gọi là truyền tham số là tham chiếu).
Ví dụ minh hoạ truyền tham số bằng biến
Phần này mình sẽ không làm ví dụ mới, mà sử dụng lại ví dụ ở trên và sửa lại một chút ở hàm hoanVi, như sau:
Phân tích
Lưu ý ở hàm trên mình chỉ bổ sung thêm dấu & trước tên biến thôi nhé. Đây chính là cách khai báo tham số là tham biến (tham chiếu). Ngoài ra hàm main vẫn giữ nguyên, do đó mình sẽ không viết lại. Việc thêm dấu & trước tên biến, chính là việc truyền vào đó địa chỉ của biến a và b trên bộ nhớ thay vì truyền giá trị của biến a và b.
Để thấy được tác dụng của việc truyền tham số kiểu này, bạn hãy cứ chạy thử lại chương trình xem kết quả như thế nào nhé. Nếu đúng, kết quả sẽ phải như thế này:
- Ví dụ nhập giá trị cho a và b như sau:Nhap gia tri cho a: 11
Nhap gia tri cho b: 10 - Sau khi thực hiện, kết quả nhận được sẽ là:Gia tri cua a la 10
Gia tri cua b la 11
Rõ ràng sau khi thực hiện hoanVi, giá trị của a và b đã đổi chỗ cho nhau. Lúc này hàm hoanVi mới thực sự đúng.
Nguyên tắc xây dựng hàm
Có một vài lưu ý cho bạn khi xây dựng hàm, Trước khi xây dựng hàm phải trả lời những câu hỏi sau:
- Hàm trả về gì? ➜ Xác định kiểu dữ liệu trả về của hàm.
- Hàm làm gì? ➜ Xác định tên hàm.
- Cần những thông tin gì để hàm xử lý? ➜ Xác định tham số. Ứng với mỗi thông tin đã xác định, xác định xem đã có giá trị trước khi vào hàm chưa?
- Nếu chưa có ➜ Truyền tham chiếu.
- Nếu có mà sau khi thực hiện xong hàm vẫn không thay đổi ➜ Truyền tham trị (không là tham chiếu).
- Nếu có mà sau khi thực hiện xong hàm thì giá trị cũng bị thay đổi theo ➜ Truyền tham chiếu
Trên đây là một số những quy tắc để bạn có thể làm quen với việc xây dựng hàm. Mình nghĩ những quy tắc này sẽ giúp bạn hiểu và xây dựng hàm tốt hơn.
Tổng kết
Về khía cạnh lập trình cơ bản, thì những kiến thức này đủ để cho bạn làm một số bài tập vận dụng hàm. Trước khi sang những phần mới, nâng cao hơn thì mình mong muốn bạn hãy ôn tập lại những kiến thức về hàm và làm một số bài tập cho thật hiểu và nhuần nhuyễn về hàm. Bởi những nội dung sắp tới, đa phần mình sẽ xây dựng hàm thay vì kiểu viết trước đây.