Pointer memberi kita kebebasan penuh: boleh kosong, boleh berpindah sasaran, boleh dihitung-hitung. Kebebasan itu punya harga — setiap pointer berpotensi salah sasaran, sehingga setiap dereference butuh kewaspadaan. C++ menyediakan alternatif yang jauh lebih ketat: reference, alias (nama panggilan) permanen untuk variabel lain. Setelah dideklarasikan, reference tidak pernah bisa diganti sasarannya; ia adalah variabel lain itu sendiri dengan nama kedua. Kita sudah menyentuh reference saat mempelajari pass-by-reference pada Section Fungsi; sekarang saatnya membedah identitasnya secara utuh.
Alias Permanen #
Reference dideklarasikan dengan tanda & di antara tipe dan nama: int& r = x; membaca “r adalah reference ke x”. Dari baris itu dan seterusnya, memakai r sama persis dengan memakai x — membacanya, menulisnya, semuanya mengenai objek asli.
#include <iostream>
int main() {
int x = 100;
int& r = x; // r adalah alias untuk x — bukan salinan
std::cout << "x = " << x << ", r = " << r << "\n";
r = 250; // mengubah x melalui alias
std::cout << "x setelah r = 250 : " << x << "\n";
int y = 999;
r = y; // BUKAN rebind: nilai y disalin ke x
std::cout << "setelah r = y : x = " << x << ", r = " << r << "\n";
// r tetap terikat pada x — alamatnya selalu sama
std::cout << "&r == &x : " << (&r == &x) << "\n";
std::cout << "&r == &y : " << (&r == &y) << "\n";
return 0;
}Output yang Dihasilkan:
x = 100, r = 100
x setelah r = 250 : 250
setelah r = y : x = 999, r = 999
&r == &x : 1
&r == &y : 0Mari kita bedah:
- Baris 6 (
int& r = x;):rdideklarasikan sebagai alias untukx. Tidak ada penyalinan yang terjadi;rdanxmenunjuk objek yang sama di memori. - Baris 9 (
r = 250;): menulis melalui alias sama dengan menulis ke objek aslinya. Tidak ada tanda*seperti pada pointer — penggunaan reference tidak beda dengan variabel biasa. - Baris 13-14 (
r = y;): baris paling penting di chapter ini. Untuk reference, assignment berarti menyalin nilaiyke objek yang di-alias-nya (x), bukan memindahkan ikatanrkey. Setelah baris inixmenjadi 999 danrtetap alias untukx. - Baris 17-18 (
&r == &x): bukti ikatannya. Mengambil alamat darirmenghasilkan alamatx— selalu. Nilai true dan false pada output menegaskanrterikat padax, bukan paday.
Aturan-Aturan Ketat Reference #
Ketatnya reference terlihat dari daftar larangannya:
- Wajib diinisialisasi saat deklarasi.
int& r;ditolak compiler dengan pesan'r' declared as reference but not initialized. Tidak ada konsep “reference kosong”. - Tidak bisa di-rebind. Begitu terikat pada
x, reference adalahxselamanya — sampai ia habis masa hidupnya. Mekanisme pindah-sasaran milik pointer (p = &lain) tidak punya padanan di reference. - Tidak punya aritmetika.
r + 1adalah nilaix + 1, bukan “alias berikutnya”. Tidak ada operasi yang bekerja pada ikatannya.
Aturan-aturan ini membuat reference tidak pernah perlu diperiksa: kita selalu yakin ia menunjuk objek yang sah. Kepastian itulah alasan reference menjadi pilihan bawaan untuk meneruskan objek ke fungsi, seperti pada pass-by-reference dan pass-by-const-reference yang sering kita pakai untuk std::string dan std::vector.
Reference versus Pointer, Sekilas #
Dua fitur ini sering membingungkan pemula karena tampak menyediakan hal serupa: dua cara menuju satu objek. Tabel berikut merangkum perbedaan pokoknya; pembahasan lengkap beserta panduan memilih ada pada Chapter Pointer vs Reference di akhir Section ini.
| Aspek | Pointer | Reference |
|---|---|---|
| Sintaks penggunaan | butuh * (dereference) dan & (address-of) | dipakai seperti variabel biasa |
| Inisialisasi | boleh tanpa inisialisasi (berisiko) | wajib saat deklarasi |
| Ganti sasaran (rebind) | bisa, kapan saja | tidak bisa |
| Bisa tanpa sasaran | ya (nullptr) | tidak |
| Pointer/reference arithmetic | ada (p + 1) | tidak ada |
| Level ketegasan compiler | longgar, banyak tanggung jawab di programmer | ketat, banyak kesalahan tertangkap dini |
Reference melengkapi persenjataan kita. Namun sebelum memakai keduanya secara serius, ada satu keluarga pointer yang belum kita urai: pointer yang diberi kunci const. Kombinasinya menghasilkan tiga bentuk deklarasi dengan makna berbeda — dan sering tertukar.
Referensi: cppreference — reference declaration , cppreference — reference initialization .