Bazı kullanımları toplamaya çalışıyorum:
Kullanım ömrünü uzatmak için bazı geçici olarak const'a başvurmak. Referans bir temel olabilir - ve onun yıkıcısının sanal olması gerekmez - doğru yıkıcı yine de denir:
ScopeGuard const& guard = MakeGuard(&cleanUpFunction);
Kod kullanarak açıklama :
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 numara Alexandrescu'nun ScopeGuard yardımcı program sınıfında kullanılır. Geçici kapsam dışına çıktığında, Derived'in yıkıcısı doğru şekilde çağrılır. Yukarıdaki kod bazı küçük ayrıntıları gözden kaçırıyor, ancak asıl önemli olan bu.
Diğer yöntemlerin bu nesnenin mantıksal durumunu değiştirmeyeceğini söylemek için const kullanın.
struct SmartPtr {
int getCopies() const { return mCopiesMade; }
};
Derleyicinin ne zaman kopyalamanız gerekip gerekmediğine karar vermenize yardımcı olması için, yazma üzerine kopyalama sınıfları için const kullanın .
struct MyString {
char * getData() { /* copy: caller might write */ return mData; }
char const* getData() const { return mData; }
};
Açıklama : Orijinal ile kopyalanan nesnenin verileri aynı kaldığı sürece bir şeyi kopyaladığınızda verileri paylaşmak isteyebilirsiniz. Nesnelerden biri veriyi değiştirdiğinde, şimdi iki versiyona ihtiyacınız var: Biri orijinal, diğeri kopya için. Yani, bir yazıyı kopyalıyorsun her iki nesneye , böylece artık her ikisinin de kendi sürümleri olur.
Kodu 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 kod parçası benim GCC'de aynı adresi yazdırır, çünkü kullanılan C ++ kitaplığı bir yazma üzerine kopyala uygular std::string
. Her iki dizge de ayrı nesneler olsalar bile, dizgi verileri için aynı belleği paylaşır. b
Const olmayan yapmak, const olmayan sürümünü tercih eder operator[]
ve GCC, yedek bellek arabelleğinin bir kopyasını oluşturur, çünkü onu değiştirebiliriz ve a
! ' Nin verilerini etkilememelidir .
int main() {
string const a = "1234";
string b = a;
// outputs different addresses!
cout << (void*)&a[0] << ", " << (void*)&b[0];
}
Copy-yapıcının const nesnelerinden ve geçicilerden kopya oluşturması için :
struct MyClass {
MyClass(MyClass const& that) { /* make copy of that */ }
};
Önemsiz bir şekilde değiştirilemeyen sabitler yapmak için
double const PI = 3.1415;
Olası pahalı veya imkansız by-value geçişini önlemek için değer yerine referansla rastgele nesneler iletmek için
void PrintIt(Object const& obj) {
// ...
}