SORU
5 Mart 2013, Salı


Statik anahtar ve C çeşitli kullanımları

static anahtar kelime, çok kafa karıştırıcı buluyorum C birçok anlamı vardır ve asla onun aslında çalışmak gerekiyordu nasıl aklım bükebilirim.

Anladığım kadarıyla orada static depolama süresi anlamına gelir sürdüğü için ömür boyu program davanın bir genel, ama ne konuştuğun hakkında bir yerel, anlamına geliyor başlatıldı sıfır varsayılan olarak.

C Standardı anahtar static: sınıf veri üyeleri için bunu söylüyor

3.7.1 Statik depolama süresi [temel.stc.statik]

3 anahtar kelime statik statik depolama süresi ile yerel bir değişken bildirmek için kullanılabilir.

4 anahtar kelime statik bir sınıf tanımında bir sınıf veri üyesi için uygulanan veri üyesi statik depolama süresi verir.

Bununla ne demekyerel değişken? Bu işlev yerel bir değişkendir? Sadece bir kez başlatılır static yerel olarak bir işlev bildirmek de o var çünkü, bu girmeden ilk kez işlevi.

Ayrıca sadece sınıf üyeleri açısından depolama süresi bahsediyor, ne de static hiç bir özelliği olmayan örnek belirli varlık? Veya depolama süresini?

Şimdi ne davası hakkında static ve dosya kapsamı ile? Tüm global değişkenler varsayılan olarak statik depolama süresine sahip olduğu kabul edilir? Aşağıdaki bölüm 3.7.1) çok işaret gibi görünüyor:

Dinamik depolama süresi olan 1 Tüm değişkenler, depolama süresi konu yokyerel değilstatik depolama süresi var. Bu kişiler için depolama program süresi (3.6.2, 3.6.3) devam edecektir

Nasıl static değişken bağlantı ilgisi var?

static bütün bu anahtar kelime biri için farklı kullanımları İngilizce netleştirmek ve ayrıca bana söyleyebilir düpedüz kafa karıştırıcıne zamanstatic sınıfının bir üyesi başlatılamıyor?

CEVAP
5 Mart 2013, Salı


Değişkenler:

static değişkenler için var "ömür boyu"çeviri tanımlanan bu birimve:

  • Eğer ad bir kapsam (fonksiyonlar ve ders dışında Yani) ise, o zaman başka bir çeviri biriminden ulaşılabilir. Bu olarak bilinen "iç bağlantı". (Dont' başlıklarında bunu yapmak çok kötü bir fikir)
  • Bir değişkenbir işlevsadece başka bir yerel değişken gibi işlev dışında erişilebilir olamaz. (bu bahsedilen yerel)
  • sınıf üyeleri hiçbir yasak kapsamı static nedeni var ama sınıf olarak bir örneği (std::string::npos) gibi ele alınabilir.

Daha önce herhangi bir işlevi, bir çeviri birimi idam (belki sonra main başladı yürütme), değişkenleri statik depolama süresine çeviri birimi olacak "sürekli başlatıldı" (constexpr mümkünse, ya da sıfır başka), ve sonra olmayan yerliler, "dinamik olarak başlatılan" doğrusırayla çeviri birimi olarak tanımlanmıştır(constexpr değil std::string="HI"; gibi şeyler için). Son olarak, işlev-yerel statik başlatılır ilk kez yürütme "ulaşır" ilan nerede olduklarını hattı. Başlatma ters sırada yok.

En kolay yolu bu doğru yapmak için tüm statik değişken olmayan constexpr başlatılmış içine fonksiyon statik yerliler, hangi yapar emin tüm statik/genel değerler vardır başlatıldı düzgün kullanmaya çalıştığınızda onları ne olursa olsun, önler static initialization order fiasco.

T& get_global() {
    static T global = initial_value();
    return global;
}

Spec diyor dikkatli olun, ad-kapsam değişkenleri "varsayılan olarak," çeviri birimi hayat boyu "bit, ama bunu yapmaz . yani" statik depolama süresi var çünkü ^em>değildosya dışında giriş yapılamaz.

Fonksiyonlar

Önemli ölçüde daha kolay, static genellikle sınıfın üye fonksiyonu olarak kullanılır, ve çok nadiren kendi başına ayakta durabilen bir işlev için kullanılır.

Bir statik üye işlevi farklıdır normal bir üye işlevi çağrılabilir olmadan bir örnek, bir sınıf, ve o zamandan beri hiç bir örneği, erişemiyor statik olmayan üye sınıf. Statik değişkenler kesinlikle kesinlikle static üye değişkenleri yönetmek için herhangi bir örnek üyeleri için, ya da başvuran bir sınıf için bir işlev için kullanmak istediğinizde kullanışlıdır.

struct A {
    A() {  A_count;}
    A(const A&) {  A_count;}
    A(A&&) {  A_count;}
    ~A() {--A_count;}

    static int get_count() {return A_count;}
private:
    static int A_count;
}

int main() {
    A var;

    int c0 = var.get_count(); //some compilers give a warning, but it's ok.
    int c1 = A::get_count(); //normal way
}

static serbest işlevi, bir fonksiyonu başka bir çeviri birimi tarafından sevk edilecektir anlamına gelir, ve böylece linker onu tamamen görmezden gelebilirsiniz. Bu amaçla küçük bir numarası vardır:

  • Cpp dosyası işlevi asla başka bir dosya tarafından kullanılıyor olduğunu güvence altına almak için kullanılabilir.
  • Bir başlık ve her dosya işlevi kendi kopyasına sahip olacaktır. Kullanışlı değil, yana içi hemen hemen aynı şeyi yapıyor.
  • Hızlandırır işe azaltarak zaman link
  • Her TU aynı isimde bir fonksiyon vermek ve farklı şeyler yapabilirler. Örneğin, her cpp static void log(const char*) {} bir dosya koyabilirsiniz, ve farklı bir şekilde giriş yapabilirler.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Break

    Break

    10 Aralık 2005
  • AutoStream's Garage419

    AutoStream's

    15 EKİM 2007
  • JamesAtiPhone

    JamesAtiPhon

    16 EYLÜL 2010