Anda sedang menggunakan mode :

[C++] Notes about Reference

0

Written on 21.05 by Muharrom, Muhammad Aji

Beberapa hari ini saya terserang sakit, namun itu memberi saya kesempatan untuk belajar lebih dalam tentang C++. Dalam pengalaman saya beberapa hari ini, saya mendapat beberapa catatan tentang reference c++. Ini dia.. 

Reference dalam c++ seperti nama lain dari suatu objek/variabel. Reference mungkin agak ribet (terutama bagi saya), namun tetap berguna dan harus dipelajari. Deklarasinya mudah, yaitu:
*   type& nama_variabel(variabel_yg_ditunjuk);
Menurut pemahaman saya, reference itu tidak bisa diinisialisasi dengan operator=, saat program berjalan, melainkan nilainya harus diinisialisasi saat dideklarasikan, seperti telah tertera di atas. Contohnya:
*   int k; int &r(k);
Sintaks tersebut akan mendeklarasikan variabel bilangan bulat k, dan reference r yang menunjuk ke k. Karena hal inilah, reference jadi kurang praktis, tidak seperti pointer yang bisa digunakan utk menunjuk ke mana-mana(namanya juga pointer,penunjuk), dan akibatnya saya menganggapnya ribet. Tapi, reference sangat berguna ketika kita berbicara soal fungsi. Pada c++, dengan reference kita bisa melakukan sesuatu yang namanya _pass by reference_, dengan sintaks:
*    functype nama_fungsi( type& var1, type& var2,..);
Jika kita melakukan _pass by reference_, maka jika mengubah variabel yang digunakan sebagai parameter, maka nilai sebenarnya dari variabel tersebut akan berubah, tidak hanya lokal dalam fungsi tersebut. Tentu kita sudah akrab dengan istilah _pass by reference_ ini, dan di bahasa pemrograman lain pun pasti ada cara melakukan ini. Istilahnya, variabel asli dan variabel dalam fungsi menunjuk ke alamat memori yang sama. Hal ini memudahkan kita karena dalam bahasa C, untuk tujuan ini harus digunakan pointer.
Selain itu kita juga bisa menggunakan _reference to pointer_ sebagai parameter fungsi yang kita buat. Tujuannya sama, agar pointer dalam fungsi dan di luar fungsi keduanya berubah. Sintaksnya:
*   type*& nama_variabel;
Bisa juga ditulis
*   type * &nama_variabel;
atau semacamnya. Gunanya misalnya dalam fungsi kita ingin mengalokasikan memori baru untuk pointer yang kita jadikan parameter(yang sebelumnya tidak punya alamat memori), kita harus menggunakan reference to pointer atau pointer to pointer( yang lebih ribet ). Kalo tidak menggunakan salah satu dari keduanya, di luar fungsi pointer bakal tetep nunjuk ke alamat lama yang ditunjuknya, bukan alamat baru yang udah dialokasikan tadi. Untuk lebih mudah dalam mencapai tujuan ini, disarankan memakai _reference to pointer_.
Namun, meski terdapat _reference to pointer_, tidak ada yang namanya _pointer to reference_, karena pointer 'kan menunjuk ke alamat tertentu, sedangkan alamat reference kan sama dengan alamat variabel yang diwakilinya, jadi kalo pointer ke reference ya sama aja pointer ke variabel aslinya.
Selain itu sepertinya kita tidak dapat mendeklarasikan _array of references_ (pernah dicoba dan compile error), dan kalo dipikir-pikir repot juga ya bikin array of references, kan harus diinisialisasi satu-satu pas dideklarasiin. Untuk lebih baik mending pake pointer/array of pointers deh. Deklarasi array of pointers sangat mudah, yaitu dengan sintaks ini:
*    type *nama_variabel[];
Perlu diingat, saat kita menggunakan _array_ sebagai _parameter_ sebuah fungsi, array itu secara otomatis menggunakan _pass by reference_. Karena pada dasarnya array itu adalah pointer, yang menunjuk ke lokasi memori tertentu yang sudah dialokasikan, serta tidak bisa digunakan untuk menunjuk ke alamat memori yang lain. Sintaks pembuatan fungsi dgn array sbg parameter adalah biasa:
*   functype fungsi(type array[]);
Sintaks tersebut bisa juga ditulis
*    functype fungsi(type * array);
Dan jika terdapat sebuah array a dengan 10 elemen misalnya, pemanggilan
*    fungsi(a);
pada kedua fungsi tersebut, di dalam keduanya variabel lokal array perlakuannya sama. Perhatikan bahwa sintaks
*    a[0]
ekuivalen dengan
*    *a
dan sintaks
*    a[i]
ekuivalen dengan
*    *(a+i)
Namun hati-hati jika belum mengalokasikan memori untuk sebuah pointer, maka *(a+i) maupun a[i] pada pointer *a yg belum punya memori yg dialokasikan untuknya tentu menghasilkan error.
Satu catatan tambahan, untuk struktur atau kelas tertentu, misal p adalah pointer ke objek struct/class, maka sintaks berikut:
*(1)    p->member
*(2) (*p).member
adalah ekuivalen, dan akan mengembalikan nilai dari "member" yang merupakan anggota objek yang ditunjuk oleh p.
sedangkan sintaks ini
*(3) *p.member
akan memberikan hasil berbeda, yaitu akan mengembalikan nilai dari variabel yang ditunjuk oleh pointer "member", yg mana "member" dianggap anggota objek p. Jadi jangan salah, utamakan pake p->member!