SORU
18 Ocak 2009, Pazar


&Quot kullanır bunların kaç tanesinin ve hangi;sabit" C ?

Benim için hala çok belirsiz gözüken bir yapıları vardır acemi bir C programcısı olarak, bunlardan biri const. Bir acemi canlı çıkmak için neredeyse imkansız olduğunu çok farklı etkileri ile birçok yerde kullanabilirsiniz. Bazı C guru sonsuza kadar çeşitli kullanır ve sonra bunları kullanmak için neden ve/veya açıklayacak?

CEVAP
18 Ocak 2009, Pazar


Bazı kullanır toplamaya çalışırken:

Bağlama başvurusu-sabit, ömrünü uzatmak için bazı geçici.Başvuru üssü olabilir - ve yıkıcı sanal olmasına gerek yok - sağ yıkıcı hala denir:

ScopeGuard const& guard = MakeGuard(&cleanUpFunction);

Açıklamakod kullanarak:

struct ScopeGuard { 
    ~ScopeGuard() { } // not virtual
};

template<typename T> struct Derived : ScopeGuard { 
    T t; 
    Derived(T t):t(t) { }
    ~Derived() {
        t(); // call function
    }
};

template<typename T> Derived<T> MakeGuard(T t) { return Derived<T>(t); }

Bu hile Alexandrescu ScopeGuard Yardımcı Sınıf olarak kullanılıyor. Geçici kapsam dışına gittikten sonra, Elde edilen yıkıcı doğru denir. Yukarıdaki kod bazı küçük ayrıntıları kaçırmaz, ama bu büyük bir anlaşma.

< / ^ hr .

İnş yöntemleri bu nesnenin mantıksal durumunu değiştirmez başkalarına anlatmak için kullanın.

struct SmartPtr {
    int getCopies() const { return mCopiesMade; }
};

< / ^ hr .

-Kopya yazmak sınıflar için sabit kullanınderleyici kopyalamak için gereken zaman ve ne zaman karar vermek için yardımcı olun.

struct MyString {
    char * getData() { /* copy: caller might write */ return mData; }
    char const* getData() const { return mData; }
};

AçıklamaBir şey copie nesne ediyorum aslında ve bu veri aynı kaldığı sürece kopyalarken veri paylaşmak isteyebilirsiniz. Bir kez nesne değişiklikleri veri olduğunu, ancak şimdi iki sürümü: orijinal ve kopya için. Yani, senkopyalabiryazınya, şimdi de kendi sürümü çok nesne için.

Kod kullanarak:

int main() {
    string const a = "1234";
    string const b = a;
    // outputs the same address for COW strings
    cout << (void*)&a[0] << ", " << (void*)&b[0];
}

Yukarıdaki Pasajı kullanılan C kütüphanesi copy-on-write std::string uygular çünkü benim GCC aynı Adres yazdırır. Farklı nesneleri olmalarına rağmen, her iki dizeleri, dize verileri için aynı bellek paylaşımı. b olmayan sabit olacak tercih olmayan sabit sürümü operator[] GCC oluşturur bir kopyasını desteğini bellek tampon, çünkü biz değişebilir ve olmamalıdır etkiler veri a!

int main() {
    string const a = "1234";
    string b = a;
    // outputs different addresses!
    cout << (void*)&a[0] << ", " << (void*)&b[0];
}

< / ^ hr .

Kopya-yapıcı sabit nesneler ve geçici kopyalar yapmak için:

struct MyClass {
    MyClass(MyClass const& that) { /* make copy of that */ }
};

< / ^ hr .

Basit değiştiremez bunu yapmak için sabitler

double const PI = 3.1415;

< / ^ hr .

Değer başvuruyla keyfi nesneleri geçirilmesi için yerine- muhtemelen pahalı ya da imkansız-değeri geçen engelliyor

void PrintIt(Object const& obj) {
    // ...
}

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Majestic Casual

    Majestic Cas

    28 NİSAN 2012
  • TheMasterOfHell100

    TheMasterOfH

    13 AĞUSTOS 2011
  • xiaoyu85

    xiaoyu85

    20 ŞUBAT 2010