Melewatkan Parameter : Pass-By-Value dan Pass-By-Reference

c c++


 
    Terdapat dua metode atau cara yang digunakan untuk melewatkan parameter ke dalam sebuah fungsi, yaitu berdasarkan fungsi, yaitu berdasarkan nilai (disebut pass-by-value) dan berdasarkan referensi atau alamatnya (disebut pass-by-reference). Pada bagian ini kita akan membahas mengenai perbedaan cara kerja antara kedua metode tersebut serta cara melakukannya di dalam C++.

Melewatkan Parameter Berdasarkan Nilai (Pass-By-Value)


    Sesuai dengan namanya, fungsi ini akan melewatkan nilai parameter  ke dalam sebuah fungsi untuk digunakan sesuai proses yang terdapat di dalam fugnsi tersebut. Jika kita melewatkan parameter dengna cara ini maka nilai yang dihasilkan oleh fungsi tidak akan mempengaruhi nilai yang terdapat pada program (di luar fungsi tersebut). Hal ini  disebabkan karena pada saat pemanggilan fungsi, compiler hanya akan membuat salinan (copy) dari nilai yang terdapat pada paremeter aktual ke parameter formal. Dengan kata lain, yang akan berubah adalah nilai di dalam fungsi saja. Untuk lebih jelasnya, coba perhatikan kode program di bawah ini :

#include <iostream>
using namespace std;
// Membuat fungsi dengan melewatkan
// nilai X ke dalamnya
void Kali2(int X) {
  X = X * 2;
  cout<<"Nilai di dalam fungsi: "<<X<<endl;
}
// Fungsi utama
int main() {
  int Bilangan;
  cout<<"Masukkan sebuah bilangan bulat: ";
  cin>>Bilangan;
  cout<<endl;
  // Menampilkan nilai awal
  cout<<"Nilai awal: "<<Bilangan<<endl;
  // Memanggil fungsi Kali2
  Kali2(Bilangan);
  // Menampilkan nilai akhir
  cout<<"Nilai akhir: "<<Bilangan<<endl;
  return 0;
}

Contoh hasil yang akan diberikan dari program di atas adalah sebagai berikut :

Masukkan sebuah bilangan bulat : 10
Nilai awal : 10
Nilai di dalam fungsi : 20
Nilai akhir : 10
Berikut ini contoh lain yang memperlihatkan pengiriman parameter dengan berdasarkan nilai.

#include <iostream>
using namespace std;
// Mendefinisikan fungsi
// untuk menukarkan dua buah bilangan
void TukarBilangan(int X, int Y) {
  int Z = X;
  X = Y;
  Y = Z;
  // Menampilkan bilangan
  // yang terdapat di dalam fungsi
  cout<<"Di dalam fungsi"<<endl;
  cout<<"Bilangan ke-1: "<<X<<endl;
  cout<<"Bilangan ke-2: "<<Y<<endl;
  cout<<endl;
}
// Fungsi utama
int main() {
  // Mendeklarasikan variabel
  // Bilangan1 dan Bilangan2
  int Bilangan1, Bilangan2;
  cout<<"Masukkan bilangan pertama: ";
  cin>>Bilangan1;
  cout<<"Masukkan bilangan kedua  : ";
  cin>>Bilangan2;
  // Menampilkan nilai awal
  cout<<"Keadaan awal"<<endl;
  cout<<"Bilangan ke-1: "<<Bilangan1<<endl;
  cout<<"Bilangan ke-2: "<<Bilangan2<<endl;
  cout<<endl;
  // Memanggil fungsi TukarBilangan()
  TukarBilangan(Bilangan1, Bilangan2);
  // Menampilkan nilai akhir
  // setelah pemanggilan fungsi TukarBilangan()
  cout<<"Keadaan akhir"<<endl;
  cout<<"Bilangan ke-1: "<<Bilangan1<<endl;
  cout<<"Bilangan ke-2: "<<Bilangan2;
  return 0;
}
 Contoh hasil yang diberikan dari program di atas adalah sebagai berikut :

Masukkan bilangan pertama  : 21
Masukkan bilangan kedua     : 78
Keadaan awal
Bilangan ke-1 : 21
Bilangan ke-2 : 78
Di dalam fungsi
Bilangan ke-1 : 78
Bilangan ke-2 : 21
Keadaan akhir
Bilangan ke-1 : 21
Bilangan ke-2 : 78
    Dari hasil di atas dapat disimpulkan bahwa fungsi tersebut tidak dapat mengubah (dalam hal ini menukarkan ) bilangan-bilangan yang dimaksud karena nilai yang terdapat di dalam fungsi tidak mempengaruhi nilai luar. Untuk menangani kasus semacam ini kita perlu menggunakan metode pass-by reference untuk melewatkan parameter ke dalam fungsi "TukarBilangan()" .



Melewatkan Parameter Berdasarkan Referensi (Pass-By-Reference) 


    Berbeda dengna pass-by-value, pass-by-reference adalah metode untuk melewatkan parameter ke seubuah fungsi berdasarkan alamatnya. Kita tahu bahwa jika kita membuat alias (referensi) dari sebuah variabel maka alamat dari variabel dan alias tersebut adalah sama. Hal inilah yang menjadi konsep dasar pengiriman parameter berdasarkan alamat.

Melewatkan parameter dengna cara seperti ini akan menyebabkan nilai yang terdapat di dalam fungsi akan sama persis dengan nilai yang terdapat pada program (di luar fungsi). Hal ini tentunya disebabkan karena alamat dari variabel yang berperan sebagai parameter formal sama dengan alamat dari variabel yang berperan sebagai parameter aktual.

Untuk lebih memahaminya, coba perhatikan program di bawah ini :

#include <iostream>
using namespace std;
// Mendefinsikan fungsi
// yang melewatkan parameter
// berdasarkan alamat
void Kali2(int& X) { // Gunakan tanda &
                     // untuk membuat alias
                     // atau referensi
  X = X * 2;              
  cout<<"Nilai di dalam fungsi: "<<X<<endl;
}
int main() {
  int Bilangan;
  cout<<"Masukkan sebuah bilangan bulat: ";
  cin>>Bilangan;
  cout<<endl;
  // Menampilkan nilai awal
  cout<<"Nilai awal: "<<Bilangan<<endl;
  // Memanggil fungsi Kali2()
  Kali2(Bilangan);
  // Menampilkan nilai akhir
  cout<<"Nilai akhir: "<<Bilangan<<endl;
  return 0;
}
 Contoh hasil yang akan diberikan dari program di atas adalah sebagai berikut :

Masukkan sebuah bilangan bulat : 10
Nilai awal : 10
Nilai di dalam fungsi : 20
Nilai akhir : 20

    Dikarenakan X bukanlah sebuah variabel , melainkan sebuah alias (nama lain) atau referensi dari variabel Bilangan. Maka dari itu, alias x dan variabel Bilangan tentu mempunyai alamat yang sama karena keduanya sebenarnya merupakan objek yang sama. Dengan demikian, jika nilai X berubah, maka nilai yang terdapat pada variabel Bilangan pun akan ikut berubah.

Berikut ini contoh lain menggunakan pass-by-reference.

#include <iostream>
using namespace std;
// Mendefinsikan fungsi
// untuk menukarkan dua buah bilangan
void TukarBilangan(int& X, int& Y) {
  int Z = X;
  X = Y;
  Y = Z;
  // Menampilkan bilangan
  // yang terdapat di dalam fungsi
  cout<<"Di dalam fungsi"<<endl;
  cout<<"Bilangan ke-1: "<<X<<endl;
  cout<<"Bilangan ke-2: "<<Y<<endl;
  cout<<endl;
}
// Fungsi utama
int main() {
  // Mendeklarasikan variabel
  // Bilangan1 dan Bilangan2
  int Bilangan1, Bilangan2;
  cout<<"Masukkan bilangan pertama: ";
  cin>>Bilangan1;
  cout<<"Masukkan bilangan kedua  : ";
  cin>>Bilangan2;
  cout<<endl;

  // Menampilkan nilai awal
  cout<<"Keadaan awal"<<endl;
  cout<<"Bilangan ke-1: "<<Bilangan1<<endl;
  cout<<"Bilangan ke-2: "<<Bilangan2<<endl;
  cout<<endl;
  // Memanggil fungsi TukarBilangan()
  TukarBilangan(Bilangan1, Bilangan2);
  // Menampilkan nilai akhir
  // setelah pemanggilan fungsi TukarBilangan()
  cout<<"Keadaan akhir"<<endl;
  cout<<"Bilangan ke-1: "<<Bilangan1<<endl;
  cout<<"Bilangan ke-2: "<<Bilangan2;
  return 0;
}

Contoh hasil yang akan diberikan dari program di atas adalah sebagai berikut :

Masukkan bilangan pertama : 21
Masukkan bilangan kedua    : 78
Keadaan awal
Bilangan ke-1 : 21
Bilangan ke-2 : 78
Di dalam fungsi
Bilangan ke-1 : 78
Bilangan ke-2 : 21
Keadaan akhir
Bilangan ke-1 : 78
Bilangan ke-2 : 21

     Selain menggunakan alias atau referensi, kita juga dapat menggunkan pointer untuk melewatkan parameter berdasarkan alamat. Namun perlu untuk diperhatikan, pada saat pemanggilan fungsi tersebut kita harus memanggil alamat dari parameter aktual, yaitu dengan menggunakan operator &. Sebagai contoh, kita akan melakukan modifikasi program di atas dengan mengunakan parameter yang bertipe pointer.

#include <iostream>
using namespace std;
// Mendefinisikan fungsi
// dengan parameter bertipe pointer
void TukarBilangan(int *X, int *Y) {
  int Z = *X;
  *X = *Y;
  *Y = Z;
  // Menampilkan bilangan
  // yang terdapat di dalam fungsi
  cout<<"Di dalam fungsi"<<endl;
  cout<<"Bilangan ke-1: "<<*X<<endl;
  cout<<"Bilangan ke-2: "<<*Y<<endl;
  cout<<endl;
}
// Fungsi utama
int main() {
  // Mendeklarasikan variabel
  // Bilangan1 dan Bilangan2
  int Bilangan1, Bilangan2;
  cout<<"Masukkan bilangan pertama: ";
  cin>>Bilangan1;
  cout<<"Masukkan bilangan kedua  : ";
  cin>>Bilangan2;
  cout<<endl;

  // Menampilkan nilai awal
  cout<<"Keadaan awal"<<endl;
  cout<<"Bilangan ke-1: "<<Bilangan1<<endl;
  cout<<"Bilangan ke-2: "<<Bilangan2<<endl;
  cout<<endl;
  // Memanggil fungsi TukarBilangan
  // Ingat, gunakan operator &
  TukarBilangan(&Bilangan1, &Bilangan2);  
  // Menampilkan nilai akhir setelah pemanggilan fungsi tukar
  cout<<"Keadaan akhir"<<endl;
  cout<<"Bilangan ke-1: "<<Bilangan1<<endl;
  cout<<"Bilangan ke-2: "<<Bilangan2;
  return 0;
}
Hasilnya adalah :

 Masukkan bilangan pertama : 21
Masukkan bilangan kedua    : 78
Keadaan awal
Bilangan ke-1 : 21
Bilangan ke-2 : 78
Di dalam fungsi
Bilangan ke-1 : 78
Bilangan ke-2 : 21
Keadaan akhir
Bilangan ke-1 : 78
Bilangan ke-2 : 21

0 Response to "Melewatkan Parameter : Pass-By-Value dan Pass-By-Reference"

Post a Comment