Kata kunci static
adalah salah satu yang memiliki beberapa makna dalam C + + yang saya temukan sangat membingungkan dan saya tidak pernah bisa membengkokkan pikiran saya tentang bagaimana sebenarnya seharusnya bekerja.
Dari apa yang saya mengerti ada static
durasi penyimpanan, yang berarti bahwa itu berlangsung selama seumur hidup program dalam kasus global, tetapi ketika Anda berbicara tentang lokal, itu berarti nol diinisialisasi secara default.
Standar C ++ mengatakan ini untuk anggota data kelas dengan kata kunci static
:
3.7.1 Durasi penyimpanan statis [basic.stc.static]
3 Kata kunci statis dapat digunakan untuk mendeklarasikan variabel lokal dengan durasi penyimpanan statis.
4 Kata kunci statis diterapkan ke anggota data kelas dalam definisi kelas memberikan durasi penyimpanan statis anggota data.
Apa artinya dengan variabel lokal ? Apakah itu variabel fungsi lokal? Karena ada juga yang ketika Anda mendeklarasikan fungsi lokal sebagai static
itu hanya diinisialisasi sekali, pertama kali memasuki fungsi ini.
Itu juga hanya berbicara tentang durasi penyimpanan berkenaan dengan anggota kelas, bagaimana dengan itu tidak spesifik misalnya, itu juga properti dari static
no? Atau apakah itu durasi penyimpanan?
Sekarang bagaimana dengan kasing static
dan ruang lingkup file? Apakah semua variabel global dianggap memiliki durasi penyimpanan statis secara default? Berikut ini (dari bagian 3.7.1) tampaknya mengindikasikan demikian:
1 Semua variabel yang tidak memiliki durasi penyimpanan dinamis, tidak memiliki durasi penyimpanan utas, dan tidak lokal memiliki durasi penyimpanan statis. Penyimpanan untuk entitas ini akan berlangsung selama durasi program (3.6.2, 3.6.3)
Bagaimana static
hubungannya dengan keterkaitan suatu variabel?
Seluruh static
kata kunci ini benar-benar membingungkan, dapatkah seseorang mengklarifikasi kegunaan yang berbeda untuk bahasa Inggris dan juga memberi tahu saya kapan harus menginisialisasi anggota static
kelas?
Jawaban:
Variabel:
static
variabel ada untuk "seumur hidup" dari unit terjemahan yang didefinisikan , dan:constexpr
. Ada lagi, dan Anda berakhir dengan variabel terpisah di setiap unit terjemahan, yang gila membingungkan)static
, tetapi dapat diatasi dari kelas serta instance (sepertistd::string::npos
). [Catatan: Anda dapat mendeklarasikan anggota statis di kelas, tetapi mereka biasanya masih harus didefinisikan dalam unit terjemahan (file cpp), dan karenanya, hanya ada satu per kelas]lokasi sebagai kode:
Sebelum fungsi apa pun dalam unit terjemahan dieksekusi (mungkin setelah
main
dimulainya eksekusi), variabel dengan durasi penyimpanan statis (ruang lingkup namespace) dalam unit terjemahan tersebut akan "diinisialisasi konstan" (constexpr
jika mungkin, atau nol jika tidak), dan kemudian non- penduduk setempat "diinisialisasi secara dinamis" dengan benar sesuai urutan yang ditentukan dalam unit terjemahan (untuk hal-hal sepertistd::string="HI";
itu tidakconstexpr
). Akhirnya, statika fungsi-lokal akan diinisialisasi saat eksekusi pertama kali "mencapai" garis di mana mereka dinyatakan. Semuastatic
variabel hancur dalam urutan terbalik inisialisasi.Cara termudah untuk mendapatkan semua ini dengan benar adalah membuat semua variabel statis yang tidak
constexpr
diinisialisasi ke dalam fungsi lokal statis, yang memastikan semua statika / global Anda diinisialisasi dengan benar ketika Anda mencoba menggunakannya tidak peduli apa pun, sehingga mencegah inisialisasi statis memesan kegagalan .Hati-hati, karena ketika spesifikasi mengatakan variabel namespace-scope memiliki "durasi penyimpanan statis" secara default, mereka berarti bit "seumur hidup unit terjemahan", tetapi itu tidak berarti itu tidak dapat diakses di luar file.
Fungsi
Secara signifikan lebih mudah,
static
sering digunakan sebagai fungsi anggota kelas, dan hanya sangat jarang digunakan untuk fungsi berdiri bebas.Fungsi anggota statis berbeda dari fungsi anggota biasa sehingga dapat dipanggil tanpa turunan kelas, dan karena tidak memiliki turunan, ia tidak dapat mengakses anggota kelas yang tidak statis. Variabel statis berguna ketika Anda ingin memiliki fungsi untuk kelas yang sama sekali tidak merujuk ke anggota contoh, atau untuk mengelola
static
variabel anggota.Fungsi
static
bebas berarti bahwa fungsi tersebut tidak akan dirujuk oleh unit terjemahan lain, dan dengan demikian penghubung dapat mengabaikannya sepenuhnya. Ini memiliki sejumlah kecil tujuan:static void log(const char*) {}
di setiap file cpp, dan mereka masing-masing bisa login dengan cara yang berbeda.sumber
classname::
cakupannya. Fungsi anggota kelas statis seperti fungsi global tetapi mencakup kelas, atau seperti anggota normal tetapi tanpathis
(itu bukan pilihan - keduanya harus setara).namespace A { static int x; }
, yang berarti hubungan internal dan sangat berbeda dari perilaku anggota data kelas statis .Durasi penyimpanan statis berarti bahwa variabel berada di tempat yang sama dalam memori selama masa program.
Keterkaitan adalah ortogonal untuk ini.
Saya pikir ini adalah perbedaan paling penting yang dapat Anda buat. Memahami hal ini dan yang lainnya, serta mengingatnya, harus mudah (tidak menangani @Tony secara langsung, tetapi siapa pun yang mungkin membaca ini di masa mendatang).
Kata kunci
static
dapat digunakan untuk menunjukkan hubungan internal dan penyimpanan statis, tetapi pada dasarnya ini berbeda.Iya. Terlepas dari kapan variabel diinisialisasi (panggilan pertama ke fungsi dan ketika jalur eksekusi mencapai titik deklarasi), variabel tersebut akan berada di tempat yang sama di memori selama umur program. Dalam hal ini,
static
berikan penyimpanan statis.Ya, semua global memiliki durasi penyimpanan statis menurut definisi (sekarang kami telah membersihkan apa artinya). Tetapi variabel ruang lingkup namespace tidak dideklarasikan dengan
static
, karena itu akan memberi mereka hubungan internal, jadi variabel per unit terjemahan.Ini memberi variabel namespace-lingkup hubungan internal. Ini memberikan anggota dan variabel lokal durasi penyimpanan statis.
Mari kita bahas semua ini:
Tentunya, kecuali Anda sudah terbiasa dengannya. :) Mencoba menghindari menambahkan kata kunci baru ke bahasa, panitia menggunakan kembali yang ini, IMO, untuk efek ini - kebingungan. Ini digunakan untuk menandakan hal-hal yang berbeda (mungkin saya katakan, mungkin hal-hal yang berlawanan).
sumber
static int x
pada lingkup namespace, apakah itu memberikan penyimpanan non-statis ?Untuk mengklarifikasi pertanyaan, saya lebih suka mengkategorikan penggunaan kata kunci 'statis' dalam tiga bentuk berbeda:
(SEBUAH). variabel
(B). fungsi
(C). variabel anggota / fungsi kelas
Penjelasan berikut di bawah ini untuk masing-masing sub judul:
(A) kata kunci 'statis' untuk variabel
Yang satu ini bisa sedikit rumit tetapi jika dijelaskan dan dipahami dengan benar, itu cukup mudah.
Untuk menjelaskan hal ini, pertama-tama sangat berguna untuk mengetahui tentang ruang lingkup, durasi dan keterkaitan variabel, yang tanpanya hal-hal selalu sulit dilihat melalui konsep keruh dari kata kunci staic
1. Cakupan : Menentukan di mana dalam file, variabel dapat diakses. Ini dapat terdiri dari dua jenis: (i) Lingkup Lokal atau Blok . (ii) Lingkup Global
2. Durasi : Menentukan kapan variabel dibuat dan dihancurkan. Sekali lagi ini dari dua jenis: (i) Durasi Penyimpanan Otomatis (untuk variabel yang memiliki cakupan Blok atau Lokal). (ii) Durasi Penyimpanan Statis (untuk variabel yang memiliki Cakupan Global atau variabel lokal (dalam suatu fungsi atau dalam blok kode) dengan statis ).
3. Tautan : Menentukan apakah suatu variabel dapat diakses (atau ditautkan) di file lain. Sekali lagi (dan untungnya) terdiri dari dua jenis: (i) Tautan Internal (untuk variabel yang memiliki Cakupan Blok dan Cakupan Global / Cakupan File / Cakupan Namespace Global) (ii) Tautan Eksternal (untuk variabel yang hanya memiliki Cakupan Global / Cakupan File / Ruang Lingkup Namespace Global)
Mari kita lihat contoh di bawah ini untuk pemahaman yang lebih baik tentang variabel global dan lokal polos (tidak ada variabel lokal dengan durasi penyimpanan statis):
Kini hadir konsep Linkage. Ketika variabel global yang didefinisikan dalam satu file dimaksudkan untuk digunakan dalam file lain, keterkaitan variabel memainkan peran penting.
Tautan variabel global ditentukan oleh kata kunci: (i) statis , dan, (ii) eksternal
(Sekarang Anda mendapatkan penjelasannya)
kata kunci statis dapat diterapkan pada variabel dengan cakupan lokal dan global, dan dalam kedua kasus, keduanya memiliki arti yang berbeda. Pertama-tama saya akan menjelaskan penggunaan kata kunci 'statis' dalam variabel dengan cakupan global (di mana saya juga menjelaskan penggunaan kata kunci 'eksternal') dan kemudian untuk mereka yang memiliki cakupan lokal.
1. Kata Kunci Statis untuk variabel dengan cakupan global
Variabel global memiliki durasi statis, artinya mereka tidak keluar dari lingkup ketika blok kode tertentu (misalnya main ()) di mana ia digunakan berakhir. Bergantung pada tautan, mereka dapat diakses hanya di dalam file yang sama di mana mereka dideklarasikan (untuk variabel global statis), atau di luar file bahkan di luar file tempat mereka dideklarasikan (extern type global variable)
Dalam kasus variabel global yang memiliki extern specifier, dan jika variabel ini sedang diakses di luar file yang telah diinisialisasi, itu harus dideklarasikan ke depan dalam file di mana itu sedang digunakan, sama seperti fungsi harus maju menyatakan apakah definisi itu dalam file yang berbeda dari yang digunakan.
Sebaliknya, jika variabel global memiliki kata kunci statis, itu tidak dapat digunakan dalam file di luar yang telah dinyatakan.
(lihat contoh di bawah untuk klarifikasi)
misalnya:
main3.cpp
sekarang setiap variabel dalam c ++ dapat berupa konst atau non-konst dan untuk setiap 'konstanta' kita mendapatkan dua case dari default c ++ linkage, jika tidak ada yang ditentukan:
(i) Jika variabel global adalah non-const, hubungannya dengan extern secara default , yaitu variabel global non-const dapat diakses dalam file .cpp lain dengan deklarasi maju menggunakan kata kunci extern (dengan kata lain, non const global variabel memiliki hubungan eksternal (dengan durasi statis tentu saja)). Juga penggunaan kata kunci extern dalam file asli di mana telah didefinisikan berlebihan. Dalam hal ini untuk membuat variabel global non-const tidak dapat diakses ke file eksternal, gunakan specifier 'statis' sebelum jenis variabel .
(ii) Jika variabel global adalah const, tautannya statis secara default , yaitu variabel global const tidak dapat diakses dalam file selain dari yang ditentukan, (dengan kata lain, variabel global const memiliki hubungan internal (dengan durasi statis tentu saja)). Juga penggunaan kata kunci statis untuk mencegah variabel global konst diakses dari file lain adalah berlebihan. Di sini, untuk membuat variabel global konst memiliki hubungan eksternal, gunakan specifier 'extern' sebelum jenis variabel
Berikut ini ringkasan untuk variabel lingkup global dengan berbagai tautan
Selanjutnya kami menyelidiki bagaimana variabel global di atas berperilaku ketika diakses dalam file yang berbeda.
2. Kata Kunci Statis untuk variabel dengan Lingkup Lokal
Pembaruan (Agustus 2019) pada kata kunci statis untuk variabel dalam cakupan lokal
Selanjutnya ini dapat dibagi lagi dalam dua kategori:
(i) kata kunci statis untuk variabel dalam blok fungsi , dan (ii) kata kunci statis untuk variabel dalam blok lokal yang tidak disebutkan namanya.
(i) kata kunci statis untuk variabel dalam blok fungsi.
Sebelumnya, saya menyebutkan bahwa variabel dengan cakupan lokal memiliki durasi otomatis, yaitu mereka muncul ketika blok dimasukkan (baik itu blok normal, baik itu blok fungsi) dan tidak ada lagi ketika blok berakhir, panjang cerita pendek, variabel dengan cakupan lokal memiliki durasi otomatis dan variabel durasi otomatis (dan objek) tidak memiliki hubungan yang berarti mereka tidak terlihat di luar blok kode.
Jika specifier statis diterapkan ke variabel lokal dalam blok fungsi, ia mengubah durasi variabel dari otomatis ke statis dan waktu hidup adalah seluruh durasi program yang berarti memiliki lokasi memori tetap dan nilainya diinisialisasi hanya sekali sebelum memulai program seperti yang disebutkan dalam referensi cpp (inisialisasi tidak boleh dikacaukan dengan penugasan)
mari kita lihat sebuah contoh.
Melihat kriteria di atas untuk variabel lokal statis dan variabel global statis, orang mungkin tergoda untuk bertanya, apa perbedaan di antara mereka. Sementara variabel global dapat diakses pada setiap titik di dalam kode (di sama serta unit terjemahan yang berbeda tergantung pada const -ness dan ekstern -ness), variabel statis didefinisikan dalam blok fungsi tidak langsung dapat diakses. Variabel harus dikembalikan oleh nilai fungsi atau referensi. Mari kita tunjukkan ini dengan sebuah contoh:
Penjelasan lebih lanjut tentang pilihan variabel lokal global dan statis statis dapat ditemukan di untaian stackoverflow ini
(ii) kata kunci statis untuk variabel dalam blok lokal yang tidak disebutkan namanya.
variabel statis dalam blok lokal (bukan blok fungsi) tidak dapat diakses di luar blok setelah blok lokal keluar dari ruang lingkup. Tidak ada peringatan untuk aturan ini.
C ++ 11 memperkenalkan kata kunci
constexpr
yang menjamin evaluasi ekspresi pada waktu kompilasi dan memungkinkan kompiler untuk mengoptimalkan kode. Sekarang jika nilai variabel const statis dalam lingkup diketahui pada waktu kompilasi, kode dioptimalkan dengan cara yang mirip dengan yang adaconstexpr
. Ini contoh kecilSaya merekomendasikan pembaca juga untuk mencari perbedaan antara
constexpr
danstatic const
untuk variabel-variabel di thread stackoverflow ini . ini menyimpulkan penjelasan saya untuk kata kunci statis yang diterapkan pada variabel.B. kata kunci 'statis' yang digunakan untuk fungsi
dalam hal fungsi, kata kunci statis memiliki makna langsung. Di sini, ini merujuk pada keterkaitan fungsi Biasanya semua fungsi yang dideklarasikan dalam file cpp memiliki hubungan eksternal secara default, yaitu fungsi yang didefinisikan dalam satu file dapat digunakan dalam file cpp lain dengan deklarasi maju.
menggunakan kata kunci statis sebelum deklarasi fungsi membatasi keterkaitannya dengan internal , yaitu fungsi statis tidak dapat digunakan dalam file di luar definisi.
C. Staitc Keyword yang digunakan untuk variabel anggota dan fungsi kelas
1. kata kunci 'statis' untuk variabel anggota kelas
Saya mulai langsung dengan contoh di sini
Dalam contoh ini, variabel statis m_designNum mempertahankan nilainya dan variabel anggota pribadi tunggal ini (karena statis) dibagikan dengan semua variabel tipe objek DesignNumber
Juga seperti variabel anggota lainnya, variabel anggota statis suatu kelas tidak terkait dengan objek kelas apa pun, yang ditunjukkan oleh pencetakan anyNumber di fungsi utama
variabel anggota statis vs non-const di kelas
(i) variabel anggota statis kelas non-const Dalam contoh sebelumnya anggota statis (baik publik dan pribadi) adalah konstanta non. Standar ISO melarang anggota statis non-const untuk diinisialisasi di kelas. Karenanya seperti pada contoh sebelumnya, mereka harus diinisialisasi setelah definisi kelas, dengan peringatan bahwa kata kunci statis perlu dihilangkan.
(ii) variabel anggota const-statis kelas ini mudah dan berjalan dengan konvensi inisialisasi variabel anggota konst, yaitu variabel anggota const statis kelas dapat diinisialisasi pada titik deklarasi dan mereka dapat diinisialisasi pada akhir deklarasi kelas dengan satu peringatan bahwa kata kunci const perlu ditambahkan ke anggota statis ketika diinisialisasi setelah definisi kelas.
Namun saya akan merekomendasikan untuk menginisialisasi variabel anggota const statis pada titik deklarasi. Ini berlaku dengan konvensi C ++ standar dan membuat kode terlihat lebih bersih
untuk lebih banyak contoh tentang variabel anggota statis di kelas, lihat tautan berikut dari learncpp.com http://www.learncpp.com/cpp-tutorial/811-static-member-variables/
2. kata kunci 'statis' untuk fungsi anggota kelas
Sama seperti variabel anggota kelas dapat, bersifat statis, demikian juga fungsi anggota kelas. Fungsi anggota normal dari kelas selalu dikaitkan dengan objek dari tipe kelas. Sebaliknya, fungsi anggota statis suatu kelas tidak terkait dengan objek kelas apa pun, yaitu mereka tidak memiliki * penunjuk ini.
Kedua karena fungsi anggota statis dari kelas tidak memiliki * penunjuk ini, mereka dapat dipanggil menggunakan nama kelas dan operator resolusi lingkup dalam fungsi utama (ClassName :: functionName ();)
Ketiga, fungsi anggota statis suatu kelas hanya dapat mengakses variabel anggota statis suatu kelas, karena variabel anggota non-statis suatu kelas harus dimiliki oleh objek kelas.
untuk lebih banyak contoh tentang fungsi anggota statis di kelas, lihat tautan berikut dari learncpp.com
http://www.learncpp.com/cpp-tutorial/812-static-member-functions/
sumber
struct Foo{static const std::string name = "cpp";};
kesalahan,name
harus ditentukan di luar kelas; dengan variabel inline yang diintruksi dalam c ++ 17 kode dapat:struct Foo{static inline const std::string name = "cpp";};
2) Fungsi anggota / anggota statis publik dapat diakses dengan nama kelas dengan operator resolusi lingkup dan juga sebuah instance dengan operator titik (misalnya: instance.some_static_method ())Ini sebenarnya cukup sederhana. Jika Anda mendeklarasikan variabel sebagai statis dalam ruang lingkup fungsi, nilainya dipertahankan antara panggilan berturut-turut ke fungsi itu. Begitu:
akan ditampilkan
678
alih-alih666
, karena ia mengingat nilai yang bertambah.Adapun anggota statis, mereka mempertahankan nilainya di seluruh instance kelas. Jadi kode berikut:
akan mencetak 4, karena first.a dan second.a pada dasarnya adalah variabel yang sama. Adapun inisialisasi, lihat pertanyaan ini.
sumber
Ketika Anda mendeklarasikan
static
variabel di lingkup berkas, maka itu variabel ini hanya tersedia di bahwa file tertentu (secara teknis, * unit terjemahan, tapi mari kita tidak menyulitkan ini terlalu banyak). Sebagai contoh:a.cpp
b.cpp
main.cpp:
Untuk variabel lokal ,
static
berarti variabel tersebut akan diinisialisasi nol dan mempertahankan nilainya di antara panggilan:Untuk variabel kelas , itu berarti bahwa hanya ada satu contoh dari variabel yang dibagi di antara semua anggota kelas itu. Bergantung pada izin, variabel dapat diakses dari luar kelas menggunakan nama yang sepenuhnya memenuhi syarat.
Menandai fungsi non-kelas sebagai
static
membuat fungsi hanya dapat diakses dari file itu dan tidak dapat diakses dari file lain.a.cpp
b.cpp
Untuk fungsi anggota kelas, menandainya sebagai
static
fungsi yang tidak perlu dipanggil pada instance objek tertentu (yaitu tidak memilikithis
pointer).sumber
Variabel statis dibagi antara setiap instance dari kelas, bukannya setiap kelas memiliki variabel mereka sendiri.
Setiap instance dari 'MyClass' memiliki 'myVar' mereka sendiri, tetapi berbagi 'myStaticVar' yang sama. Bahkan, Anda bahkan tidak memerlukan instance MyClass untuk mengakses 'myStaticVar', dan Anda dapat mengaksesnya di luar kelas seperti ini:
Ketika digunakan di dalam suatu fungsi sebagai variabel lokal (dan bukan sebagai variabel anggota kelas) kata kunci statis melakukan sesuatu yang berbeda. Ini memungkinkan Anda untuk membuat variabel persisten, tanpa memberikan lingkup global.
Ini adalah variabel global dalam hal ketekunan ... tetapi tanpa menjadi global dalam cakupan / aksesibilitas.
Anda juga dapat memiliki fungsi anggota statis. Fungsi statis pada dasarnya adalah fungsi non-anggota, tetapi di dalam namespace nama kelas, dan dengan akses pribadi ke anggota kelas.
Ketika Anda memanggil fungsi anggota, ada parameter tersembunyi yang disebut 'ini', yang merupakan pointer ke instance dari kelas yang memanggil fungsi. Fungsi anggota statis tidak memiliki parameter tersembunyi ... mereka dapat dipanggil tanpa instance kelas, tetapi juga tidak dapat mengakses variabel anggota non-statis kelas, karena mereka tidak memiliki pointer 'ini' untuk digunakan. Mereka tidak dipanggil pada instance kelas spesifik apa pun.
sumber
myStaticVar
perlu didefinisikan juga. Agak penting untuk menyebutkan bahwa ketika menjawab pertanyaan tentang semantikstatic
kata kunci, bukan begitu?Saya bukan programmer C jadi saya tidak bisa memberi Anda informasi tentang penggunaan statis dalam program C dengan benar, tetapi ketika datang ke pemrograman berorientasi objek statis pada dasarnya mendeklarasikan variabel, atau fungsi atau kelas menjadi sama sepanjang kehidupan program. Ambil contoh.
Ketika Anda membuat instance kelas ini di Main Anda, Anda melakukan sesuatu seperti ini.
Dua instance kelas ini benar-benar berbeda satu sama lain dan beroperasi secara independen satu sama lain. Tetapi jika Anda membuat ulang kelas A seperti ini.
Ayo kembali ke main lagi.
Kemudian a1 dan a2 akan berbagi salinan int x yang sama dimana setiap operasi pada x dalam a1 akan secara langsung mempengaruhi operasi x dalam a2. Jadi jika saya melakukan ini
Kedua instance kelas A berbagi variabel dan fungsi statis. Semoga ini menjawab pertanyaan Anda. Pengetahuan saya yang terbatas tentang C memungkinkan saya untuk mengatakan bahwa mendefinisikan suatu fungsi atau variabel sebagai statis berarti hanya dapat dilihat oleh file yang fungsi atau variabelnya didefinisikan sebagai statis. Tetapi ini akan lebih baik dijawab oleh seorang pria C dan bukan saya. C ++ memungkinkan kedua cara C dan C ++ mendeklarasikan variabel Anda sebagai statis karena sepenuhnya kompatibel dengan C.
sumber
Ya - Non-global, seperti fungsi variabel lokal.
Baik.
artinya, semua contoh
R
pembagianint R::a
-int R::a
tidak pernah disalin.Secara efektif global yang memiliki konstruktor / penghancur jika diperlukan - inisialisasi tidak ditangguhkan hingga akses.
Untuk fungsi lokal, ini eksternal. Akses: Dapat diakses oleh fungsi (kecuali tentu saja, Anda mengembalikannya).
Untuk kelas, ini eksternal. Akses: Penentu akses standar berlaku (publik, dilindungi, pribadi).
static
juga dapat menentukan hubungan internal, tergantung di mana itu dinyatakan (file / namespace).Ini memiliki terlalu banyak tujuan dalam C ++.
Secara otomatis diinisialisasi sebelum
main
jika dimuat dan memiliki konstruktor. Itu mungkin terdengar seperti hal yang baik, tetapi urutan inisialisasi sebagian besar di luar kendali Anda, jadi inisialisasi yang kompleks menjadi sangat sulit untuk dipertahankan, dan Anda ingin meminimalkan ini - jika Anda harus memiliki statis, maka fungsi skala lokal jauh lebih baik di perpustakaan dan proyek. Sejauh data dengan durasi penyimpanan statis, Anda harus mencoba meminimalkan desain ini, terutama jika dapat diubah (variabel global). Inisialisasi 'waktu' juga bervariasi karena sejumlah alasan - loader dan kernel memiliki beberapa trik untuk meminimalkan jejak memori dan menunda inisialisasi, tergantung pada data yang dimaksud.sumber
Objek Statis: Kita dapat mendefinisikan anggota statis dengan kata kunci statis Ketika kita mendeklarasikan anggota kelas sebagai statis itu berarti tidak peduli berapa banyak objek kelas yang dibuat, hanya ada satu salinan anggota statis.
Anggota statis dibagikan oleh semua objek kelas. Semua data statis diinisialisasi ke nol ketika objek pertama dibuat, jika tidak ada inisialisasi lainnya. Kita tidak bisa memasukkannya ke dalam definisi kelas tetapi dapat diinisialisasi di luar kelas seperti yang dilakukan dalam contoh berikut dengan mendeklarasikan ulang variabel statis, menggunakan operator resolusi lingkup :: untuk mengidentifikasi kelas miliknya.
Mari kita coba contoh berikut untuk memahami konsep anggota data statis:
Ketika kode di atas dikompilasi dan dieksekusi, ia menghasilkan hasil sebagai berikut:
Anggota Fungsi Statis: Dengan mendeklarasikan anggota fungsi sebagai statis, Anda membuatnya independen dari objek tertentu dari kelas. Fungsi anggota statis dapat dipanggil bahkan jika tidak ada objek kelas dan fungsi statis diakses hanya menggunakan nama kelas dan operator resolusi ruang lingkup ::.
Fungsi anggota statis hanya dapat mengakses anggota data statis, fungsi anggota statis lainnya dan fungsi lainnya dari luar kelas.
Fungsi anggota statis memiliki cakupan kelas dan mereka tidak memiliki akses ke pointer kelas ini. Anda bisa menggunakan fungsi anggota statis untuk menentukan apakah beberapa objek kelas telah dibuat atau tidak.
Mari kita coba contoh berikut untuk memahami konsep anggota fungsi statis:
Ketika kode di atas dikompilasi dan dieksekusi, ia menghasilkan hasil sebagai berikut:
sumber