Anahtar kelime static
maalesef C ++ 'da birkaç farklı ilişkisiz anlama sahiptir.
Veri üyeleri için kullanıldığında, verilerin örneklerde değil sınıfta tahsis edildiği anlamına gelir .
Bir fonksiyon içindeki veriler için kullanıldığında, verilerin statik olarak tahsis edildiği, blok ilk kez girildiğinde başlatıldığı ve program sonlanıncaya kadar sürdüğü anlamına gelir . Ayrıca değişken yalnızca işlevin içinde görülebilir. Yerel statikin bu özel özelliği genellikle tekil tembel yapıları uygulamak için kullanılır.
Bir derleme birimi düzeyinde (modül) kullanıldığında, değişkenin genel (yani tahsis edilmeden önce başlatılır main
ve çalıştırılır ve imha edilir main
) olduğu , ancak değişkenin diğer derleme birimlerinde erişilebilir veya görünmeyeceği anlamına gelir .
Her kullanım için en önemli olan bölüme biraz önem verdim. Kullanım (3), dışa aktarılmamış sınıf bildirimlerine de izin veren adsız ad alanları lehine bir şekilde cesaret kırılmıştır.
Kodunuzda static
anahtar kelime 2 anlamı ile kullanılır ve sınıflar veya örneklerle ilgisi yoktur ... bu işlevin bir değişkeni ve yalnızca bir kopyası olacaktır.
Doğru şekilde iammilind'in söylediği gibi , işlev bir şablon işlevi olsaydı, bu değişkenin birden çok örneği olabilir (çünkü bu durumda aslında fonksiyonun kendisi programdaki birçok farklı kopyada mevcut olabilir). Bu durumda bile sınıflar ve örnekler ilgisizdir ... aşağıdaki örneğe bakın:
#include <stdio.h>
template<int num>
void bar()
{
static int baz;
printf("bar<%i>::baz = %i\n", num, baz++);
}
int main()
{
bar<1>(); // Output will be 0
bar<2>(); // Output will be 0
bar<3>(); // Output will be 0
bar<1>(); // Output will be 1
bar<2>(); // Output will be 1
bar<3>(); // Output will be 1
bar<1>(); // Output will be 2
bar<2>(); // Output will be 2
bar<3>(); // Output will be 2
return 0;
}
static int i
Örneğe özgü kapsamı ortaya koyan bir şey elde etmenin bir yolu var mı , yanio1.foo(); // i = 1
ve$o2.foo(); // i = 1
...?