Ressource Acquisition Is Initialisation:
Betriebsmittel (Speicher, Dateien, Mutexe, Handles) werden
ausschließlich im Konstruktur angefordert und im zugehörigen
Destruktur freigegeben. Dies entbindet den Anwender von der
fehlerträchtigen manuellen Freigabe. Der Code wird Ausnahme-sicher
(exception safe). Zum Beispiel:
{
std::ifstream is ("filename.txt");
is.read (...);
} // Eingabestrom wird automatisch geschlossen.
statt (in Java):
{
FileInputStream is = null;
try {
is.open ("filename.txt");
is.read (...);
} finally {
// Eingabestrom muss explizit geschlossen werden.
if (is != null) is.close ();
}
}
Pointer to Implementation: Die Deklaration eines Klasse enthält nur einen Zeiger auf eine Struktur mit den Attributen. Auf diese Weise kann man die interne Repräsentation eines Objekts anpassen, ohne die Schnittstelle zu ändern.
foo.h
class Foo {
struct pimpl;
struct pimpl * p;
public:
virtual ~Foo ();
Foo ();
Foo (const Foo & f);
Foo & operator= (const Foo & f);
};
foo.cc
struct Foo::pimpl { // anything... };
Foo::~Foo ()
{
delete p;
}
Foo::Foo () : p (new pimpl())
{
}
Foo::Foo (const Foo & f) : p (new pimpl (*(f.p)))
{
}
Foo &Foo::operator= (Foo f)
{
std::swap (p, f.p);
return *this;
}
Named Return Value Optimization: Der Compiler erzeugt bei der Rückgabe von komplexen Objekten keine unnötigen Kopien, der Code wird lesbarer.
Curiously Reoccuring Template Pattern: FIXME Template Meta-Programmierung
const-Referenzen!by value übergeben.by reference übergeben!