Variabel Lokal dan Variabel Global

Setiap variabel dalam bahasa C++ punya lingkupnya masing-masing. Variabel di lingkup yang sama tidak boleh punya nama yang sama. Saat variabel dideklarasikan di dalam function, variabel tersebut hanya bisa digunakan di dalamnya.

Jika deklarasi variabel dilakukan di luar function, maka variabel tersebut bisa digunakan di dalam file tempat deklarasinya dan di file yang menyertakannya dengan menggunakan #include. Sederhananya, ada dua jenis variabel berdasarkan tempat deklarasinya.

  • Variabel global : Variabel yang dideklarasikan di luar function. Variabel ini bisa digunakan semua function di dalam satu file. Deklarasinya sebaiknya diatas function main.
  • Variabel lokal : Variabel yang dideklarasikan di dalam compound statement dari function, loop, atau percabangan. Variabel tersebut hanya bisa digunakan di dalam function atau di antara tanda kurung kurawal ( {....} ) yang mengelilinginya.
Kalian bisa mendeklarasikan variabel lokal dengan nama yang sama di beberapa function berbeda. Walaupun namanya sama, setiap variabel lokal di function yang berbeda dianggap sebagai beberapa variabel yang berbeda. Contoh penggunaan variabel lokal dan variabel global bisa kalian lihat di bawah ini.

#include <iostream>

using namespace std;

int var_global=2;
string var_sama="variabel_global";

void functionku(){
    int var_lokal=3;
    cout << "===="<<endl;
    cout << "var_global : ";
    cout << var_global << endl;

    cout << "var_lokal(functionku) : ";
    cout << var_lokal << endl;
    
    cout << "nama_sama? : ";
    cout << var_sama << endl;
    cout << "===="<<endl;
}

int main(){
    int var_lokal=4;
    string var_sama="variabel lokal fungsi main";
	
    cout << "var_sama? : ";
    cout << var_sama << endl;
	
    cout << "var_global : ";
    cout << var_global << endl;
	
    cout << endl;
    functionku();
    cout << endl;

    cout << "var_lokal(main) : ";
    cout << var_lokal << endl;

    return 0;
}
Contoh:
var_sama? : variabel lokal fungsi main
var_global : 2

====
var_global : 2
var_lokal(functionku) : 3
nama_sama? : variabel_global
====

var_lokal(main) : 4

Variabel global yang namanya unik pada contoh di atas adalah var_global. Variabel tersebut bisa digunakan di semua function karena tidak ada variabel lokal dengan nama yang sama.

Variabel lokal dan variabel global boleh punya nama yang sama. Tapi, variabel lokal akan lebih diprioritaskan penggunaannya. Variabel global akan diabaikan kalau ada variabel lokal dengan nama yang sama dengan variabel tersebut. Misalnya, contoh di atas punya variabel dengan nama var_sama. Keduanya adalah variabel yang berbeda karena dideklarasikan di lingkup yang berbeda.

Fungsi main mencetak nilai var_sama yang dideklarasikan di dalamnya. Ini berbeda dengan function "functionku" yang tidak punya variabel lokal bernama var_sama. Nilai var_sama yang dicetak di dalam functionku adalah var_sama yang dideklarasikan sebagai variabel global.

Keyword Static

Setiap kali function dipanggil, variabel lokal akan dibuat di memori yang selalu berubah alamatnya. Setelah keluar dari function, variabel akan dihapus lagi. Variabel lokal akan selalu dibuat dan diinisiasi ulang dengan nilai awal yang ditentukan compiler.

Jika kalian ingin variabel hanya dibuat sekali dan tidak berubah nilainya selama program berjalan, kalian bisa menggunakan keyword static. Keyword static akan cukup berguna dalam rekursi untuk penghematan memori.

#include <iostream>

using namespace std;

void functionku(int i){
    static int var_lokal;
    
    if(i<4)functionku(i+1);
    else return;
    
    var_lokal++;
    cout << "var_lokal(functionku) : ";
    cout << var_lokal << endl;
}

int main(){
    functionku(0);

    return 0;
}
Contoh:
var_lokal(functionku) : 1
var_lokal(functionku) : 2
var_lokal(functionku) : 3
var_lokal(functionku) : 4

Contoh kode program di atas menggunakan static saat deklarasi variabel var_lokal. Keyword static membuat function hanya menggunakan satu lokasi memori penyimpanan untuk satu variabel lokal, parameter, atau variabel lain. 

Tanpa keyword static, function akan mengalokasikan memori baru untuk variabel lokal dan parameter setiap kali function dipanggil. Memori tersebut akan dibebaskan saat function selesai tugasnya. Variabel dan parameter tanpa keyword static seperti sejumlah orang atau benda yang berbeda, tapi nama dan tugasnya sama. 

Nilai var_lokal dalam contoh di atas terus bertambah setiap function dipanggil karena variabel tersebut adalah "variabel yang benar-benar sama". Perubahan tersebut tidak hanya terjadi karena adanya increment (++). Untuk lebih jelasnya, coba hilangkan static pada contoh di atas.

#include <iostream>

using namespace std;

void functionku(int i){
    int var_lokal;
    
    if(i<4)functionku(i+1);
    else return;
    
    var_lokal++;
    cout << "var_lokal(functionku) : ";
    cout << var_lokal << endl;
}

int main(){
    functionku(0);

    return 0;
}
Contoh:
var_lokal(functionku) : -1429409791
var_lokal(functionku) : 1
var_lokal(functionku) : 1
var_lokal(functionku) : -1429409023

Saat tidak menggunakan static, variabel function yang dipanggil "benar-benar variabel baru", walaupun perannya sama. Nilai pada pemanggilan sebelumnya ada di tempat penyimpanan yang benar-benar berbeda. Program mungkin saja memberikan nilai 0 atau nilai acak pada variabel lokal setiap kali function dipanggil. Kalau nilai awalnya 0 seharusnya hasilnya akan menampilkan 1 sebanyak 4 kali. Kebetulan, compiler yg saya pakai menggunakan nilai acak.