Der Versuch, einige Verwendungen zu sammeln:
Binden Sie einige temporäre an Verweis auf const, um seine Lebensdauer zu verlängern. Die Referenz kann eine Basis sein - und der Destruktor muss nicht virtuell sein - der richtige Destruktor heißt immer noch:
ScopeGuard const& guard = MakeGuard(&cleanUpFunction);
Erklärung mit Code:
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); }
Dieser Trick wird in der Dienstprogrammklasse ScopeGuard von Alexandrescu verwendet. Sobald das temporäre Element den Gültigkeitsbereich verlässt, wird der Destruktor von Derived korrekt aufgerufen. Dem obigen Code fehlen einige kleine Details, aber das ist die große Sache.
Verwenden Sie const, um anderen Methoden mitzuteilen, dass der logische Status dieses Objekts nicht geändert wird.
struct SmartPtr {
int getCopies() const { return mCopiesMade; }
};
Verwenden Sie const für Copy-on-Write-Klassen , damit der Compiler Ihnen bei der Entscheidung hilft, wann und wann Sie nicht kopieren müssen.
struct MyString {
char * getData() { /* copy: caller might write */ return mData; }
char const* getData() const { return mData; }
};
Erläuterung : Möglicherweise möchten Sie Daten freigeben, wenn Sie etwas kopieren, solange die Daten des ursprünglichen und des kopierten Objekts gleich bleiben. Sobald eines der Objekte Daten ändert, benötigen Sie jedoch zwei Versionen: eine für das Original und eine für die Kopie. Das heißt, Sie kopieren auf eine Schreiben in eines der Objekte, sodass beide jetzt ihre eigene Version haben.
Code verwenden :
int main() {
string const a = "1234";
string const b = a;
// outputs the same address for COW strings
cout << (void*)&a[0] << ", " << (void*)&b[0];
}
Das obige Snippet druckt dieselbe Adresse auf meinem GCC, da die verwendete C ++ - Bibliothek eine Kopie beim Schreiben implementiert std::string. Obwohl beide Zeichenfolgen unterschiedliche Objekte sind, verwenden sie denselben Speicher für ihre Zeichenfolgendaten. Wenn Sie bnon-const machen, wird die non-const-Version von bevorzugt, operator[]und GCC erstellt eine Kopie des Sicherungsspeicherpuffers, da wir ihn ändern könnten und er die Daten von nicht beeinflussen darf a!
int main() {
string const a = "1234";
string b = a;
// outputs different addresses!
cout << (void*)&a[0] << ", " << (void*)&b[0];
}
Damit der Kopierkonstruktor Kopien von const-Objekten und temporären Objekten erstellt :
struct MyClass {
MyClass(MyClass const& that) { /* make copy of that */ }
};
Zum Erstellen von Konstanten, die sich trivial nicht ändern können
double const PI = 3.1415;
Zum Übergeben beliebiger Objekte als Referenz anstelle von Wert - um möglicherweise teures oder unmögliches Übergeben von Nebenwerten zu verhindern
void PrintIt(Object const& obj) {
// ...
}