Direkomendasikan, 2024

Pilihan Editor

Perbedaan Antara Call By Value dan Call by Reference

Di C ++ dan Java, ada dua cara untuk memanggil fungsi atau metode. Yang pertama adalah "panggilan berdasarkan nilai" dan yang kedua adalah "panggilan dengan referensi". Metode panggilan dengan nilai hanya meneruskan nilai variabel ke kode fungsi, dan jika ada perubahan dalam nilai variabel di dalam fungsi itu tidak mempengaruhi nilai asli dari variabel itu. Dalam metode panggilan dengan referensi, kami mengirimkan variabel itu sendiri dalam argumen, dan perubahan nilai variabel juga memengaruhi nilai asli variabel tersebut. Perbedaan utama antara kedua metode adalah, metode panggilan dengan nilai melewati nilai suatu variabel dan panggilan dengan referensi melewati alamat variabel itu.

Grafik perbandingan:

Dasar untuk PerbandinganCall_By_ValuePanggil Dengan Referensi
Dasar
Salinan variabel dilewatkan.Variabel itu sendiri dilewatkan.
EfekPerubahan dalam salinan variabel tidak mengubah nilai asli dari variabel di luar fungsi.Perubahan pada variabel juga mempengaruhi nilai variabel di luar fungsi.
Memanggil Parameterfunction_name (variable_name1, variable_name2, ...);function_name (& variable_name1, & variable_name2, ...);
// dalam kasus objek
object.func_name (objek);
Menerima parameterketik function_name (ketik variable_name1, ketik variable_name2, ...)
{. . }
ketik function_name (type * variable_name1, type * variable_name2, ...) {. . }
// dalam kasus objek
ketik function_name (class_type object_name)
{. . }
Panggilan standartipe primitif dilewatkan menggunakan "panggilan berdasarkan nilai".objek secara implisit dilewatkan menggunakan "panggilan dengan referensi".

Definisi Panggilan Menurut Nilai

Jika Anda meneruskan tipe data primitif (integer, karakter, dan string) ke fungsi / metode, maka hanya "nilainya" yang diteruskan ke kode fungsi. Fungsi menyalin nilai argumen ke 'parameter formal' dari kode fungsi. Jika ada modifikasi pada parameter formal dalam kode fungsi, itu tidak akan mengubah nilai asli dari argumen yang digunakan untuk memanggil fungsi itu.

Dengan kata sederhana, jika suatu fungsi / metode dipanggil dengan pendekatan 'call by value'; kemudian salinan variabel dilewatkan ke kode fungsi. Jika kode fungsi membuat perubahan pada nilai dalam salinan variabel, itu tidak mengubah nilai asli dari variabel.

Mari kita lihat contoh untuk memahami ini secara singkat.

 // contoh dalam cek kelas Java {void change (int i, int j) {i = i * i; j = j / 2; system.out.println ("nilai parameter di dalam fungsi"); system.out.println ("nilai 'i' yang menerima nilai argumen 'a'" + i); system.out.println ("nilai 'j' yang menerima nilai argumen 'b'" + j); }} class call_by _value {public static static utama (string args []) {int a = 12, b = 20; centang C = cek baru (); system.out.println ("nilai 'a' dan 'b' sebelum pemanggilan fungsi" + a + "" + b); C.change (a, b); // panggil dengan nilai. system.out.println ("nilai 'a' dan 'b' setelah panggilan fungsi" + a + "" + +); }} // nilai output 'a' dan 'b' sebelum function call 12 20 nilai parameter di dalam nilai fungsi 'i' yang menerima nilai argumen 'a' 144 nilai 'j' yang menerima nilai argumen 'b' 10 nilai 'a' dan 'b' setelah panggilan fungsi 12 20 

Definisi Panggilan Dengan Referensi

Metode Call by Reference memberikan referensi / alamat argumen ke kode fungsi. Ketika alamat argumen dilewatkan ke kode fungsi, parameter formal yang menerima alamat itu akan menjadi variabel 'penunjuk'. Sekarang, karena kode fungsi telah mendapatkan alamat argumen, modifikasi nilai argumen juga akan mengubah nilai asli argumen.

Dalam C ++ dan Java, sangat umum untuk melewatkan objek ke fungsi / metode dan objek selalu dilewati oleh referensi. Perubahan yang dilakukan pada objek di dalam fungsi / metode mempengaruhi objek yang digunakan untuk memanggil fungsi / metode itu.

Fragmen berikut menunjukkan cara yang benar untuk 'menelepon dengan referensi'.

 // contoh dalam C ++ class swap {void swap (int * x, int * y) {int temp; temp = * x; * x = * y; * Y = temp; }} int main {int a = 10, b = 20; Cout << "nilai a, b sebelum pemanggilan fungsi" << a << "" < 

Sekarang mari kita bahas 'call by reference' dengan melewatkan 'objek' sebagai argumen, yang secara implisit disahkan oleh pendekatan 'call by reference'.

 cek kelas {int a, b; check (int x, int b) {// objek diinisialisasi melalui konstruktor ini a = x; b = y; } membatalkan pertukaran (periksa ob) {ob.a = a * 2; ob.b = b / 2; }} kelas main_class {public static void main (string args []) {check C = cek baru (20, 40); // inisialisasi objek. system.out.println ("nilai 'ob.a' dan 'ob.b' sebelum pemanggilan fungsi" + ob.a + "" + ob.b); C.exchange (C); // panggil dengan referensi. system.out.println ("nilai 'ob.a' dan 'ob.b' sebelum pemanggilan fungsi" + ob.a + "" + ob.b); }} // nilai output 'ob.a' dan 'ob.b' sebelum function call 20 40 nilai 'ob.a' dan 'ob.b' setelah function call 40 20 

Perbedaan Kunci Antara Panggilan Dengan Nilai dan Panggilan Dengan Referensi

  1. Melewati argumen dengan menggunakan pendekatan 'panggilan berdasarkan nilai' hanya meneruskan salinan variabel itu, jadi perubahan yang dilakukan pada nilai dalam salinan variabel itu tidak memengaruhi nilai asli variabel itu. Dalam pendekatan 'panggilan dengan referensi' variabel itu sendiri dilewatkan sebagai argumen, jadi perubahan itu memodifikasi nilai dari variabel asli.
  2. Jika argumen yang dikirimkan adalah tipe data primitif, mereka hanya 'panggilan berdasarkan nilai', tetapi jika referensi / alamat argumen atau objek dilewatkan maka fungsi disebut dengan metode 'panggilan dengan referensi'.
  3. Dalam pendekatan 'panggilan dengan nilai', argumen yang diteruskan hanya nama variabel sedangkan, dalam pendekatan 'panggilan dengan referensi' argumen yang dilewati adalah, nama variabel di sepanjang tanda '&', atau objek yang dilewati hanya dengan namanya.
  4. Menerima parameter argumen dalam pendekatan 'panggilan oleh nilai' adalah nama variabel bersama dengan tipe datanya. Dalam pendekatan 'panggilan dengan referensi' parameter penerima selalu merupakan variabel penunjuk bersama dengan tipe data dan dalam kasus objek itu adalah nama objek bersama dengan tipe kelasnya.

Kesimpulan:

C ++ dan Java menggunakan kedua pendekatan tersebut tergantung pada apa yang diteruskan. Jika Anda ingin meneruskan hanya nilai dari pendekatan use'call by value 'variabel dan jika Anda ingin melihat perubahan dalam nilai asli variabel maka gunakan pendekatan' call by reference '.

Top