Trong bài học trước, chúng ta đã học về hàm mang thể trả về một trị giá cho người gọi hàm đó. Chúng ta đã sử dụng điều đó để tạo ra một hàm getValueFromUser mà chúng ta đã sử dụng trong chương trình này:
Tuy nhiên, điều gì sẽ xảy ra nếu chúng ta muốn đầu ra của một hàm để cho vào một hàm khác? Bạn mang thể thử một mẫu gì đó như thế này:
Điều này đã ko được biên dịch, vì hàm printDouble ko biết định danh num là gì?. Bạn mang thể thử khái niệm num là một biến bên trong hàm printDouble():
Mặc dù điều này khắc phục lỗi của trình biên dịch và làm cho chương trình mang thể biên dịch được, nhưng chương trình vẫn ko hoạt động xác thực (nó luôn in ra 0 và 0 nhân đôi là 0). Cốt lõi của vấn đề ở đây là hàm printDouble ko mang cách truy cập trị giá mà người sử dụng đã nhập.
Chúng ta cần một số cách để truyền trị giá của num cho hàm printDouble để printDouble mang thể sử dụng trị giá đó trong thân hàm của nó.
Những thông số và đối số
Trong nhiều trường hợp, Lúc mang thể truyền thông tin tới một hàm được gọi, để hàm đó mang dữ liệu để làm việc. Ví dụ, nếu chúng ta muốn viết một hàm để thêm hai số, chúng ta cần một số cách để nói cho hàm biết về hai số sẽ thêm lúc chúng ta gọi nó. Chúng tôi làm điều đó thông qua những thông số của hàm và đối số.
Một thông số của hàm là một biến được sử dụng trong một hàm. Những thông số của hàm hoạt động sắp như y sì với những biến được khái niệm bên trong hàm, nhưng mang một điểm khác biệt: chúng luôn được khởi tạo với một trị giá được cung ứng bởi người gọi của hàm.
Những thông số của hàm được khái niệm trong khai báo hàm bằng cách đặt chúng ở giữa dấu ngoặc đơn sau tên hàm, với nhiều thông số được phân tích bằng dấu phẩy.
Dưới đây là một số ví dụ về những hàm với số lượng thông số khác nhau:
Đối số là một trị giá được truyền từ người gọi tới hàm lúc thực hiện lệnh gọi hàm:
Lưu ý rằng nhiều đối số cũng được phân tích bằng dấu phẩy.
Làm thế nào những thông số và đối số làm việc với nhau
Lúc một hàm được gọi, tất cả những thông số của hàm được tạo dưới dạng những biến và trị giá của từng đối số được sao chép một cách khớp vào thông số tương ứng. Quá trình này được gọi là gán trị giá vào(pass by value).
Ví dụ:
Lúc hàm printValues được gọi với những đối số 6 và 7, thông số x của printValues được tạo và khởi tạo với trị giá 6 và thông số y của printValues được tạo và khởi tạo với trị giá 7.
Điều này dẫn tới kết quả đầu ra:
Lưu ý rằng số lượng đối số thường phải khớp với số lượng thông số hàm hoặc ko thì trình biên dịch sẽ đưa ra lỗi. Đối số được truyền cho một hàm mang thể là bất kỳ biểu thức hợp thức nào (vì về cơ bản, đối số chỉ là một trình khởi tạo trị giá cho thông số và những khởi tạo mang thể là bất kỳ biểu thức hợp thức nào).
Sửa chữa chương trình này cùng chúng tôi
Trong chương trình này, biến num trước tiên được khởi tạo với trị giá được nhập bởi người sử dụng. Sau đó, hàm printDouble được gọi và trị giá của num được sao chép vào thông số trị giá của hàm printDouble. Hàm printDouble sau đó sử dụng trị giá của thông số đó.
Sử dụng trị giá trả về làm đối số
Trong bài toán trên, chúng ta mang thể thấy rằng num chỉ được sử dụng một lần, để vận chuyển trị giá trả về của hàm getValueFromUser tới đối số của lệnh gọi hàm printDouble.
Chúng ta mang thể đơn thuần hóa ví dụ trên một tẹo như sau:
Ngày nay, chúng tôi sử dụng trị giá trả về của hàm getValueFromUser trực tiếp làm đối số cho hàm printDouble!
Mặc dù chương trình này ngắn gọn hơn, nhưng bạn cũng mang thể thấy cú pháp rút gọn này mang một tẹo khó đọc. Nếu bạn mang thể thoải mái hơn lúc sử dụng biến để lưu trị giá của hàm, thì đó là điều tốt.
Cảnh báo về thứ tự đối số của hàm
Đặc tả trong C ++ ko khái niệm rằng những đối số mang khớp với những thông số theo thứ tự từ trái sang phải hoặc từ phải sang trái hay ko. Lúc sao chép trị giá, thứ tự là ko thống nhất. Tuy nhiên, nếu những đối số là những lệnh gọi hàm, thì điều này mang thể mang vấn đề:
Nếu xem xét từ trái sang phải, a() sẽ được gọi trước b(). Nếu xem xét từ phải sang trái, b() sẽ được gọi trước a(). Điều này mang thể mang hoặc ko mang hậu quả, tùy thuộc vào những gì hàm a() và b() làm.
Nếu điều quan yếu là một đối số đ trước, bạn nên xác định rõ thứ tự thực hiện, tương tự:
Cảnh báo
Đặc tả trong C ++ ko xác định liệu những hàm sẽ lấy những đối số từ trái sang phải hay phải sang trái. Do đó nên chu đáo ko thực hiện những cuộc gọi hàm ngay trong những đối số của hàm nào đó lúc mang vấn đề trong thứ tự gọi những hàm.
Làm thế nào những thông số và trị giá trả về làm việc cùng nhau
Bằng cách sử dụng cả thông số và trị giá trả về, chúng ta mang thể tạo ra những hàm lấy dữ liệu làm đầu vào cho hàm khác, thực hiện một số tính toán với nó và trả về trị giá cho người gọi.
Dưới đây là một ví dụ về một hàm rất đơn thuần, cùng hai số lại với nhau và trả về kết quả cho người gọi:
Thực hiện khởi đầu chạy từ đầu hàm main. Lúc add (4, 5) được thực hiện, hàm add được gọi, thông số x được khởi tạo với trị giá 4 và thông số y được khởi tạo với trị giá 5.
Câu lệnh return trong hàm add sẽ thực hiện x + y để tạo ra trị giá 9, sau đó được trả về hàm main. Trị giá 9 này sau đó được gửi tới std :: cout để được in lên console.
Đầu ra: 9
Thêm ví dụ
Hãy cùng xem một số cuộc gọi hàm khác:
Chương trình này tạo đầu ra:
Câu lệnh trước tiên khá đơn thuần.
Trong câu lệnh thứ hai, những đối số là những biểu thức được thực hiện trước lúc được thông qua. Trong trường hợp này, 1 + Hai ước tính thành 3, vì vậy 3 được sao chép vào thông số x. 3 * 4 ước tính thành 12, do đó 12 được sao chép vào thông số y. thêm (3, 12) khắc phục thành 15.
Cặp lệnh tiếp theo cũng tương đối tiện dụng:
Trong trường hợp này, add() được gọi trong đó trị giá của a được sao chép vào cả hai thông số x và y. Vì a mang trị giá 5, nên thêm (a, a) = add (5, 5), trị giá này sẽ phân giải thành trị giá 10.
Hãy cùng xem một câu lệnh khó hiểu trước tiên trong nhóm:
Lúc hàm add được thực thi, chương trình cần xác định trị giá của thông số x và y là gì. x đơn thuần vì chúng ta chỉ truyền cho nó số nguyên là 1. Để mang được trị giá cho thông số y, trước tiên cần thực hiện bội số (2, 3). Chương trình gọi hàm nhân và khởi tạo z = Hai và w = 3, do đó nhân (2, 3) trả về trị giá nguyên 6. Trị giá trả về 6 đó hiện mang thể được sử dụng để khởi tạo thông số y của hàm add. add (1, 6) trả về số nguyên 7, sau đó được chuyển tới std :: cout để in.
Đọc bằng lời:
thêm (1, nhân (2, 3)) ước tính để thêm (1, 6) ước tính thành 7
Câu lệnh sau mang vẻ khó khăn vì một trong những thông số được cung ứng để thêm là một lệnh gọi hàm add khác.
Nhưng trường hợp này hoạt động xác thực như trường hợp trước. add (2, 3) khắc phục trước, dẫn tới trị giá trả về là 5. Ngày nay nó mang thể khắc phục add (1, 5), ước tính trị giá là 6, được chuyển tới std :: cout để in.
Phần kết luận
Những thông số của hàm và trị giá trả về là những cơ chế chính mà theo đó những hàm mang thể được viết để mang thể sử dụng lại, vì nó cho phép chúng ta viết những hàm mang thể thực hiện những tác vụ và trả lại kết quả được truy xuất hoặc tính toán cho người gọi mà ko cần biết đầu vào hoặc đầu ra cụ thể như thế nào.