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.

cpp
#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:

text
x = 100, r = 100
x setelah r = 250 : 250
setelah r = y : x = 999, r = 999
&r == &x : 1
&r == &y : 0

Mari kita bedah:

  1. Baris 6 (int& r = x;): r dideklarasikan sebagai alias untuk x. Tidak ada penyalinan yang terjadi; r dan x menunjuk objek yang sama di memori.
  2. 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.
  3. Baris 13-14 (r = y;): baris paling penting di chapter ini. Untuk reference, assignment berarti menyalin nilai y ke objek yang di-alias-nya (x), bukan memindahkan ikatan r ke y. Setelah baris ini x menjadi 999 dan r tetap alias untuk x.
  4. Baris 17-18 (&r == &x): bukti ikatannya. Mengambil alamat dari r menghasilkan alamat x — selalu. Nilai true dan false pada output menegaskan r terikat pada x, bukan pada y.

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 adalah x selamanya — sampai ia habis masa hidupnya. Mekanisme pindah-sasaran milik pointer (p = &lain) tidak punya padanan di reference.
  • Tidak punya aritmetika. r + 1 adalah nilai x + 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.

AspekPointerReference
Sintaks penggunaanbutuh * (dereference) dan & (address-of)dipakai seperti variabel biasa
Inisialisasiboleh tanpa inisialisasi (berisiko)wajib saat deklarasi
Ganti sasaran (rebind)bisa, kapan sajatidak bisa
Bisa tanpa sasaranya (nullptr)tidak
Pointer/reference arithmeticada (p + 1)tidak ada
Level ketegasan compilerlonggar, banyak tanggung jawab di programmerketat, 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 .