Dapatkah seseorang tolong jelaskan bagaimana variabel statis dalam fungsi anggota bekerja di C ++.
Diberi kelas berikut:
class A {
void foo() {
static int i;
i++;
}
}
Jika saya mendeklarasikan beberapa instance A
, apakah memanggil foo()
satu instance menambahkan variabel statis i
pada semua instance? Atau hanya yang dipanggil?
Saya berasumsi bahwa setiap instance akan memiliki salinannya sendiri i
, tetapi melangkah melalui beberapa kode yang sepertinya menunjukkan sebaliknya.
static int i
spesifik untuk contoh, sehingga misalnyao1.foo(); // i = 1
dan$o2.foo(); // i = 1
...?m_
untuk menunjukkan status i.static
Sayangnya, kata kunci memiliki beberapa arti yang tidak terkait dalam C ++Ketika digunakan untuk anggota data itu berarti bahwa data dialokasikan di kelas dan bukan dalam hal.
Ketika digunakan untuk data di dalam suatu fungsi, itu berarti bahwa data dialokasikan secara statis, diinisialisasi saat pertama kali blok dimasukkan dan berlangsung hingga program berhenti. Juga variabel hanya terlihat di dalam fungsi. Fitur khusus statika lokal ini sering digunakan untuk menerapkan konstruksi malas lajang.
Ketika digunakan pada level unit kompilasi (modul) itu berarti bahwa variabel itu seperti global (yaitu dialokasikan dan diinisialisasi sebelum
main
dijalankan dan dihancurkan setelahmain
keluar) tetapi variabel tidak akan dapat diakses atau terlihat di unit kompilasi lainnya .Saya menambahkan beberapa penekanan pada bagian yang paling penting untuk setiap penggunaan. Penggunaan (3) agak tidak disukai demi ruang nama yang tidak disebutkan namanya yang juga memungkinkan deklarasi kelas yang tidak diekspor.
Dalam kode Anda,
static
kata kunci digunakan dengan arti nomor 2 dan tidak ada hubungannya dengan kelas atau instance ... itu adalah variabel dari fungsi dan hanya akan ada satu salinannya.Seperti yang benar iammilind katakan namun bisa saja ada beberapa contoh dari variabel itu jika fungsi itu adalah fungsi templat (karena dalam kasus itu memang fungsi itu sendiri dapat hadir dalam banyak salinan berbeda dalam program). Bahkan dalam kasus kelas kursus dan instance tidak relevan ... lihat contoh berikut:
sumber
keyword static unfortunately has a few different unrelated meanings in C++
:)Variabel statis di dalam fungsi
Variabel statis dibuat di dalam fungsi yang disimpan pada memori statis program, bukan di stack.
Inisialisasi variabel statis akan dilakukan pada panggilan pertama fungsi.
Variabel statis akan mempertahankan nilai dalam beberapa panggilan fungsi
Seumur hidup dari variabel statis adalah Program
Contohnya
Output:
Variabel statis
Nilai Variabel: 0
Nilai Variabel: 1
Nilai Variabel: 2
Nilai Variabel: 3
Nilai Variabel: 4
Variabel Otomatis
Nilai Variabel: 0
Nilai Variabel: 0
Nilai Variabel: 0
Nilai Variabel: 0
Nilai Variabel: 0
sumber
Jawaban sederhana:
Variabel statis, terlepas dari apakah mereka adalah anggota dari fungsi (non-templated)
class
atau (non-templated), berperilaku - secara teknis - seperti label global yang cakupannya terbatas padaclass
fungsi atau.sumber
MyClass& instance(){ static MyClass x("config.ini"); return x; }
- implementasi portabel yang valid untuk penggunaan utas tunggal persis karena statika lokal TIDAK hanya seperti global terlepas dari apa yang Anda katakan.