Parameter dan Argument

Function dideklarasikan dengan beberapa parameter yang tipenya berbeda-beda. Saat dipanggil, function menerima argumen dengan jumlah yang sama dengan paramater tersebut. Jumlah dan urutan tipe data argumen tersebut harus sesuai dengan parameter yang diberikan pada function. Singkatnya, argumen adalah bilangan, variabel atau konstanta yang terdapat di dalam kurung saat function dipanggil.

Setelah function dipanggil, nilai argumen akan disalin ke parameter sesuai urutannya. Statement-statement di dalam function akan dieksekusi sampai adanya return.

Saat memanggil function dengan argumen berupa variabel, ada dua cara untuk memberikan nilai dari argumen ke parameter function. Kedua cara tersebut, yaitu :

  • Parameter pass by value : Nilai argumen disalin ke parameter function. Variabel yang dijadikan argumen tidak akan berubah saat nilai parameter diubah dalam function.
  • Parameter pass by reference : Alamat variabel argumen disalin ke parameter function yang bertipe pointer. Variabel yang dijadikan argumen akan ikut berubah saat nilai parameter diubah dalam function.

Contoh-contoh sebelum ini menggunakan argumen yang disalin nilainya ke parameter function. Cara tersebut disebut dengan pass by value.

#include <iostream>

using namespace std;

void fungsiku(int x1, int x2){
    x1+=2;
    x2+=3;
    cout << "x1 (parameter function): ";
    cout << x1 << endl;
    cout << "x2 (parameter function): ";
    cout << x2 << endl;
}

int main(){
    int x1, x2;
    cout << "x1 : ";cin >> x1;
    cout << "x2 : ";cin >> x2;
    
    cout << endl;
    
    cout << "Parameter Pass by Value" << endl;
    
    cout << "x1 (variabel asli): ";
    cout << x1 << endl;
    cout << "x2 (variabel asli): ";
    cout << x2 << endl;

    cout << "ubah ..." << endl;
    fungsiku(x1, x2);

    cout << "x1 (variabel asli): ";
    cout << x1 << endl;
    cout << "x2 (variabel asli): ";
    cout << x2 << endl;
    
    return 0;
}
Contoh Program :
x1 : 2
x2 : 3

Parameter Pass by Value
x1 (variabel asli): 2
x2 (variabel asli): 3
ubah ...
x1 (parameter function): 4
x2 (parameter function): 6
x1 (variabel asli): 4
x2 (variabel asli): 6

Itu membuat nilai variabel yang dijadikan argumen tidak berubah saat nilai parameter diubah di dalam function. Cara tersebut cocok digunakan kalau kalian menggunakan angka, konstanta, atau tipe data dasar yang ukurannya kecil. Tapi, itu kurang cocok digunakan untuk struct yang ukurannya lebih besar karena punya banyak anggota.

Pass By Reference

Banyaknya variabel yang bisa diubah adalah salah satu keuntungan penggunaan parameter dengan pointer. Ini berbeda dengan saat kalian menggunakan parameter yang tipenya bukan pointer.

Selain itu, nilai yang dikembalikan dengan return oleh suatu function hanya ada satu. Supaya kalian bisa mengubah beberapa variabel sekaligus hanya dengan satu function, kalian bisa menggunakan "pass by reference".

#include <iostream>

using namespace std;

void fungsiku(int *x1, int *x2){
    *x1+=2;
    *x2+=3;
    cout << "x1 (parameter function): ";
    cout << *x1 << endl;
    cout << "x2 (parameter function): ";
    cout << *x2 << endl;
}

int main(){
    int x1, x2;
    cout << "x1 : ";cin >> x1;
    cout << "x2 : ";cin >> x2;
    
    cout << endl;
    
    cout << "Parameter Pass by Reference" << endl;
    
    cout << "x1 (variabel asli): ";
    cout << x1 << endl;
    cout << "x2 (variabel asli): ";
    cout << x2 << endl;

    cout << "ubah ..." << endl;
    fungsiku(&x1, &x2);

    cout << "x1 (variabel asli): ";
    cout << x1 << endl;
    cout << "x2 (variabel asli): ";
    cout << x2 << endl;
    return 0;
}
Contoh Program :
x1 : 2
x2 : 3

Parameter Pass by Reference
x1 (variabel asli): 2
x2 (variabel asli): 3
ubah ...
x1 (parameter function): 4
x2 (parameter function): 6
x1 (variabel asli): 4
x2 (variabel asli): 6

Contoh kode program di atas juga bisa ditulis dengan cara yang hampir sama dengan cara yang biasa digunakan di dalam bahasa pascal. Kalian tidak perlu pemanggilan dengan tanda ampersand (&). Selain itu, tanda asterisk (*) sebelum nama variabel tidak diperlukan di dalam function.

Jika bahasa pascal menggunakan "var sebelum nama parameter", C++ menandai parameter yg menerima alamat dari argumen dengan tanda ampersand (&).

#include <iostream>

using namespace std;

void fungsiku(int &x1, int &x2){
    x1+=2;
    x2+=3;
    cout << "x1 (parameter function): ";
    cout << x1 << endl;
    cout << "x2 (parameter function): ";
    cout << x2 << endl;
}

int main(){
    int x1, x2;
    cout << "x1 : ";cin >> x1;
    cout << "x2 : ";cin >> x2;
    
    cout << endl;
    
    cout << "Parameter Pass by Reference" << endl;
    
    cout << "x1 (variabel asli): ";
    cout << x1 << endl;
    cout << "x2 (variabel asli): ";
    cout << x2 << endl;

    cout << "ubah ..." << endl;
    fungsiku(x1, x2);

    cout << "x1 (variabel asli): ";
    cout << x1 << endl;
    cout << "x2 (variabel asli): ";
    cout << x2 << endl;

    return 0;
}

Hasil dari kode program di atas sama dengan kode program sebelumnya jika inputnya sama.

Parameter Bertipe Struct

Saat kalian menggunakan parameter bertipe struct, kalian sebaiknya menggunakan "parameter pass by reference". Menyalin alamat ke dalam pointer akan menghemat memori dan mempercepat proses, apalagi kalau suatu saat kalian menggunakan "rekursi".

#include <iostream>

using namespace std;

struct data_angka{
    int x1, x2;
};

void ubah_isi_struct(data_angka *tdata){
    tdata->x1+=2;
    tdata->x2+=3;
}

int main(){
    data_angka dataku;
    cout << "x1 : ";cin >> dataku.x1;
    cout << "x2 : ";cin >> dataku.x2;
    
    cout << endl;
    
    cout << "Ubah ... " << endl;
    ubah_isi_struct(&dataku);
    cout << "x1 (variabel asli): ";
    cout << dataku.x1 << endl;
    cout << "x2 (variabel asli): ";
    cout << dataku.x2 << endl;

    return 0;
}
Contoh Program :
x1 : 24
x2 : 25

Ubah...
x1 (variabel asli): 26
x2 (variabel asli): 28

Ingat! Pointer bertipe struct menggunakan "->" untuk mengakses nilai member variabel (asli) yang ditunjuk pointer. Saat pemanggilan fungsi, kalian perlu menggunakan tanda ampersand (&).

Parameter Bertipe Array

Parameter bertipe array tidak perlu tanda ampersand (&). Itu karena array dianggap sebagai pointer yang menunjuk alamat awal dari "deretan" beberapa nilai. Kalian bisa menggunakan argumen berupa array pada function yang parameternya bertipe pointer yang tipe data dasarnya sama.

#include <iostream>

using namespace std;

void pola_segitiga (int *pdata){
int j;
    while(pdata[0]!=0){
    	j=0;
    	while(pdata[j]!=0){
    	    cout<<pdata[j] << " ";
    	    j++;
        }
    	pdata++;
        cout << endl;
    }
}

int main(){
    int dataku[20]={12, 14, 16, 18, 20, 22, 24,26, 28, 30, 0};
    
    pola_segitiga(dataku);

    return 0;
}
Output :
12 14 16 18 20 22 24 26 28 30
14 16 18 20 22 24 26 28 30
16 18 20 22 24 26 28 30
18 20 22 24 26 28 30
20 22 24 26 28 30
22 24 26 28 30
24 26 28 30
26 28 30
28 30
30

Contoh di atas menggunakan variabel dataku yang merupakan array bilangan bulat (int). Function pola_segitiga  menggunakan pointer dengan tipe int. Walaupun function tersebut menggunakan pointer, argumennya bisa berupa array tanpa perlu tanda ampersand (&).