Pada Section Dasar Pemrograman kita sudah memakai variabel seperti nama dan umur tanpa membahasnya secara formal. Sekarang saatnya membedahnya dengan serius, karena variabel adalah wadah utama data di hampir setiap program C++. Sebuah variabel pada dasarnya adalah lokasi memori yang diberi nama dan tipe: nama dipakai untuk menyebutnya di kode, sedangkan tipe memberi tahu compiler berapa banyak memori yang disiapkan dan operasi apa yang boleh dilakukan terhadap data tersebut. Pada Chapter ini kita membedah anatomi deklarasi variabel, menulis beberapa declarator dalam satu baris, membedakan deklarasi dari definisi, dan melihat bahaya senyap ketika variabel dipakai tanpa diberi nilai lebih dulu.
Anatomi Deklarasi Variabel #
Bentuk paling dasar dari sebuah deklarasi variabel adalah tiga komponen yang berjejer: tipe, lalu nama, lalu titik koma. Compiler membaca pasangan tipe dan nama itu, lalu menyiapkan ruang memori seukuran tipe tersebut. Setelah dideklarasikan, variabel bisa diisi lewat assignment (=) atau langsung diberi nilai pada baris deklarasinya sendiri. Program berikut memperlihatkan kedua jalur itu sekaligus:
#include <iostream>
int main() {
int harga; // deklarasi: tipe + nama
harga = 15000; // assignment mengisi nilai sesudahnya
int jumlah = 3; // deklarasi sekaligus pemberian nilai
int total = harga * jumlah; // inisialisasi dari hasil ekspresi
double berat = 0.75, ongkir = 12000; // dua declarator dalam satu baris
std::cout << "Total belanja : " << total << "\n";
std::cout << "Berat total : " << berat * jumlah << " kg\n";
std::cout << "Ongkir : " << ongkir << "\n";
return 0;
}Output yang Dihasilkan:
Total belanja : 45000
Berat total : 2.25 kg
Ongkir : 12000Mari kita bedah baris demi baris:
- Baris 5 (
int harga;): deklarasi murni. Compiler menyiapkan memori sebesar satuintdengan namaharga, tetapi belum menentukan isinya. - Baris 6 (
harga = 15000;): assignment. Nilai15000dituliskan ke memori milikharga, menggantikan isi yang belum ditentukan itu. - Baris 8-9: dua deklarasi yang sekaligus diberi nilai. Perhatikan
totalmendapatkan nilainya dari hasil ekspresiharga * jumlah, yang dievaluasi compiler terlebih dahulu menjadi45000. - Baris 11 (
double berat = 0.75, ongkir = 12000;): satu deklarasi dengan dua declarator — pola yang dibahas di bagian berikutnya. - Baris 13-15: tiga nilai dicetak lewat
std::cout. Ekspresiberat * jumlahdihitung pada saat program berjalan menghasilkan2.25.
Perhatikan bahwa int harga; dan int jumlah = 3; sama-sama deklarasi; bedanya hanya pada pemberian nilai. Pemberian nilai pada saat deklarasi punya nama khusus, initialization, dan menjadi topik penuh pada Chapter Inisialisasi Variabel.
Banyak Declarator dalam Satu Baris #
C++ mengizinkan kita mendeklarasikan beberapa variabel sekaligus dalam satu pernyataan, dipisah koma, asal semuanya bertipe sama. Bentuk ini disebut multiple declarators: double berat = 0.75, ongkir = 12000; membuat dua variabel double dalam satu langkah, dan setiap declarator boleh punya initializer sendiri. Yang tidak boleh adalah mencampur tipe berbeda dalam satu pernyataan — int a, double b; langsung ditolak compiler dengan pesan error: expected unqualified-id before 'double', karena setelah koma compiler hanya menerima declarator baru untuk tipe int.
Meski sah secara bahasa, banyak tim menyarankan satu deklarasi per baris. Dengan satu variabel per baris, setiap baris punya tempat untuk komentar, dan git diff (alat pencatat perubahan kode) menampilkan perubahan dengan lebih rapi. Untuk pemula, satu deklarasi per baris juga mengurangi risiko lupa memberi nilai pada salah satu variabel.
Deklarasi versus Definisi #
Dalam kosakata standar C++, declaration adalah pernyataan yang memperkenalkan nama dan tipenya kepada compiler, sedangkan definition adalah declaration yang juga menyiapkan memorinya. Setiap definisi otomatis merupakan deklarasi, tetapi tidak sebaliknya. Untuk variabel, pernyataan int harga; yang selama ini kita tulis adalah definisi: memori benar-benar dialokasikan di situ.
Ada bentuk yang murni deklarasi tanpa definisi, yaitu dengan kata kunci extern:
extern int penghitung; // deklarasi saja: nama diperkenalkan, tanpa memori baru
int penghitung; // definisi: deklarasi + alokasi memori
Kapan bentuk extern ini berguna? Ketika satu variabel harus dipakai bersama oleh beberapa file .cpp, variabelnya didefinisikan di satu file, sedangkan file lain cukup melihat deklarasinya. Topik ini akan masuk akal penuh ketika kita belajar separate compilation pada Section Modularity dan Software Design; untuk saat ini cukup ingat kontrasnya: deklarasi memperkenalkan nama, definisi menyediakan memori.
Variabel Tanpa Nilai Awal: Nilai Tak Tentu #
Apa yang sebenarnya tersimpan di int harga; sebelum kita mengisinya? Jawaban standar C++ tegas: nilai tak tentu (indeterminate value). Variabel lokal yang tidak diinisialisasi memuat sisa bit apa pun yang kebetulan berada di lokasi memori itu, dan membacanya adalah undefined behavior — perilaku yang tidak didefinisikan standar, sehingga apa pun boleh terjadi. Compiler modern berusaha membantu dengan peringatan saat kompilasi:
#include <iostream>
int main() {
int skor;
std::cout << "Skor: " << skor << "\n";
return 0;
}Pesan yang diberikan g++ saat mengompilasi kode di atas:
uninit-demo.cpp: In function ‘int main()’:
uninit-demo.cpp:5:30: warning: ‘skor’ is used uninitialized [-Wuninitialized]
5 | std::cout << "Skor: " << skor << "\n";
| ^~~~
uninit-demo.cpp:4:9: note: ‘skor’ was declared here
4 | int skor;
| ^~~~Ketika program ini dijalankan di komputer penulis, tercetak Skor: 779647075 — angka yang tidak pernah kita masukkan. Angka itu bisa berbeda antar mesin, antar compiler, bahkan antar eksekusi, karena isinya adalah sisa memori. Perilaku yang tidak bisa kita andalkan sama saja dengan perilaku yang salah.
Kebiasaan “deklarasi langsung dengan nilai” paling mudah dijaga kalau kita hafal pilihan bentuknya. Chapter berikutnya membedah tiga bentuk inisialisasi di C++ — =, tanda kurung, dan kurung kurawal — beserta alasan mengapa kurung kurawal kini menjadi rekomendasi modern.
Rujukan resmi untuk topik Chapter ini: declarations dan initialization di cppreference.