Biểu đồ so sánh:
Cơ sở để so sánh | Gọi_By_Value | Gọi theo tài liệu tham khảo |
---|---|---|
Căn bản | Một bản sao của biến được thông qua. | Một biến chính nó được thông qua. |
Hiệu ứng | Thay đổi trong một bản sao của biến không sửa đổi giá trị ban đầu của biến ra bên ngoài hàm. | Thay đổi trong biến cũng ảnh hưởng đến giá trị của biến ngoài hàm. |
Thông số gọi | function_name (biến_name1, biến_name2, ...); | function_name (& biến_name1, & biến_name2, ...); // trong trường hợp của đối tượng object.func_name (object); |
Nhận thông số | gõ function_name (gõ biến_name1, gõ biến_name2, ...) {. . } | gõ function_name (loại * biến_name1, loại * biến_name2, ...) {. . } // trong trường hợp của đối tượng gõ function_name (class_type object_name) {. . } |
Gọi mặc định | loại nguyên thủy được thông qua bằng cách sử dụng "gọi theo giá trị". | các đối tượng được truyền ngầm bằng cách sử dụng "gọi theo tham chiếu". |
Định nghĩa cuộc gọi theo giá trị
Nếu bạn chuyển một kiểu dữ liệu nguyên thủy (số nguyên, ký tự và chuỗi) cho một hàm / phương thức, thì chỉ có giá trị của nó. Hàm sao chép giá trị của đối số thành 'tham số chính thức' của mã chức năng. Nếu có bất kỳ sửa đổi nào đối với tham số chính thức trong mã chức năng, nó sẽ không sửa đổi giá trị ban đầu của đối số được sử dụng để gọi hàm đó.
Nói một cách đơn giản, nếu một hàm / phương thức được gọi theo phương pháp 'gọi theo giá trị'; sau đó một bản sao của biến được truyền cho mã chức năng. Nếu một mã chức năng thực hiện bất kỳ thay đổi nào đối với giá trị trong bản sao của biến, thì nó không thay đổi giá trị ban đầu của biến.
Hãy xem một ví dụ để hiểu ngắn gọn về điều này.
// ví dụ trong lớp Java kiểm tra {void change (int i, int j) {i = i * i; j = j / 2; system.out.println ("giá trị của tham số bên trong hàm"); system.out.println ("giá trị của 'i' chấp nhận giá trị của đối số 'a'" + i); system.out.println ("giá trị của 'j' chấp nhận giá trị của đối số 'b'" + j); }} lớp call_by _value {public static void main (chuỗi args []) {int a = 12, b = 20; kiểm tra C = kiểm tra mới (); system.out.println ("giá trị của 'a' và 'b' trước khi gọi hàm" + a + "" + b); C. Trao đổi (a, b); // gọi theo giá trị. system.out.println ("giá trị của 'a' và 'b' sau khi gọi hàm" + a + "" + b); }} // giá trị đầu ra của 'a' và 'b' trước khi hàm gọi 12 20 giá trị của tham số bên trong giá trị hàm của 'i', chấp nhận giá trị của đối số 'a' 144 giá trị của 'j' chấp nhận giá trị của đối số 'b' 10 giá trị của 'a' và 'b' sau khi gọi hàm 12 20
Định nghĩa cuộc gọi theo tham chiếu
Gọi theo phương thức Reference chuyển một tham chiếu / địa chỉ của một đối số cho mã chức năng. Khi địa chỉ của một đối số được truyền cho mã chức năng, tham số chính thức chấp nhận địa chỉ đó sẽ là biến 'con trỏ'. Bây giờ, khi mã chức năng đã thu được địa chỉ của một đối số, việc sửa đổi giá trị của một đối số cũng sẽ sửa đổi giá trị ban đầu của một đối số.
Trong C ++ và Java, việc truyền đối tượng cho hàm / phương thức và đối tượng luôn được truyền bởi tham chiếu của nó là rất phổ biến. Các thay đổi được thực hiện cho đối tượng bên trong hàm / phương thức ảnh hưởng đến đối tượng được sử dụng để gọi hàm / phương thức đó.
Đoạn sau cho thấy cách chính xác để 'gọi theo tham chiếu'.
// ví dụ trong hoán đổi lớp C ++ {void exchange (int * x, int * y) {int temp; nhiệt độ = * x; * x = * y; * Y = tạm thời; }} int chính {int a = 10, b = 20; cout << "giá trị của a, b trước hàm gọi" << a << "" <Bây giờ, hãy thảo luận về 'gọi theo tham chiếu' bằng cách chuyển một 'đối tượng' làm đối số, được ngầm định chuyển qua cách tiếp cận 'gọi theo tham chiếu'.
kiểm tra lớp {int a, b; check (int x, int b) {// đối tượng được khởi tạo thông qua constrtuctor a = x; b = y; } void exchange (kiểm tra ob) {ob.a = a * 2; ob.b = b / 2; }} class main_group {public static void main (string args []) {check C = new check (20, 40); // khởi tạo đối tượng. system.out.println ("giá trị của 'ob.a' và 'ob.b' trước khi gọi hàm" + ob.a + "" + ob.b); C. trao đổi (C); // gọi theo tham chiếu. system.out.println ("giá trị của 'ob.a' và 'ob.b' trước khi gọi hàm" + ob.a + "" + ob.b); }} // giá trị đầu ra của 'ob.a' và 'ob.b' trước hàm gọi 20 40 giá trị của 'ob.a' và 'ob.b' sau hàm gọi 40 20Sự khác biệt chính giữa cuộc gọi theo giá trị và cuộc gọi theo tham chiếu
- Truyền đối số bằng cách sử dụng phương pháp 'gọi theo giá trị' chỉ chuyển bản sao của biến đó, vì vậy những thay đổi được thực hiện đối với giá trị trong bản sao của biến đó không ảnh hưởng đến giá trị ban đầu của biến đó. Trong cách tiếp cận 'gọi theo tham chiếu', chính biến được truyền dưới dạng đối số, do đó thay đổi đối với nó sẽ sửa đổi giá trị của biến ban đầu.
- Nếu các đối số được truyền là kiểu dữ liệu nguyên thủy, chúng chỉ đơn giản là 'gọi theo giá trị', nhưng nếu tham chiếu / địa chỉ của đối số hoặc đối tượng được truyền thì một hàm được gọi bằng phương thức 'gọi theo tham chiếu'.
- Trong 'gọi theo cách tiếp cận giá trị', các đối số được truyền chỉ là tên của các biến trong khi đó, trong 'gọi theo tham chiếu', các đối số được truyền là, tên biến dọc theo dấu '&' hoặc một đối tượng được truyền chỉ bằng tên của nó.
- Nhận tham số của đối số theo cách tiếp cận 'gọi theo giá trị' là tên biến cùng với kiểu dữ liệu của nó. Trong cách tiếp cận 'gọi theo tham chiếu', tham số nhận luôn là biến con trỏ cùng với kiểu dữ liệu và trong trường hợp đối tượng, nó là tên đối tượng cùng với loại lớp.
Phần kết luận:
C ++ và Java sử dụng cả hai cách tiếp cận tùy thuộc vào những gì được thông qua. Nếu bạn chỉ muốn chuyển giá trị của biến sử dụng theo cách tiếp cận theo giá trị 'và nếu bạn muốn thấy sự thay đổi trong giá trị ban đầu của biến thì hãy sử dụng phương pháp' gọi theo tham chiếu '.