Effective C++
Abstracted from Scott Meyers book Effektiv C++ programmieren.
Terminologie
Deklaration
Deklariert etwas; nur die Signatur; den Kopf, ohne Details/Inhalte.
extern int x; //Objektdeklaration
std::size_t numDigits(int number); // Funktionsdeklaration
class AClass; // Klassendeklaration
template<typename T> // Template Deklaration
class ATemplatedClass
Definition
Gibt Inhalte der Signaturen an; Funktionsquelltext, Klassenelemente, Objektspeicherangaben (benötigter Speicher).
int x; //Objektdefinition
…
Initialisierung
Objekt erhält Wert. Für Objekte durch Konstruktoren.
Standardkonstruktor: Kein Parameter.
explicit-deklarierte Konstruktoren: Verhindern impliziter Typumwandlungen.
Tipp: Konstruktoren, wenn kein anderer Grund, explicit deklarieren! Verhindert unerwartete Typumwandlungen.
Kopierkonstruktor: Objekt mit Objekt des selben Typs initialisieren.
Kopierzuweisungsoperator: Wert aus einem Objekt in anderes Objekt des selben Typs kopieren.
class A {
public:
A(); // Standardkonstruktor
A(const A& obj); // Kopierkonstruktor
A& operator=(const A& obj); // Kopierzuweisungsoperator
};
A a1; // Aufruf des Standardkonstruktors
A a2(a1); // Aufruf des Kopierkonstruktors
a1 = a2; // Aufruf des Kopierzuweisungsoperators
// Achtung! bei:
A a3 = a2; // Aufruf des Kopierkonstruktors! a3 wird hier, im Gegensatz zu a1 oben, erst konstruiert.
Hinweis: Kopierkonstruktor wird auch für Parameterübergabe by Value verwendet.
Funktionsobjekte
Funktionspbjekte stammen aus Klassen, die operator() überladen; den Operator für Funktionsaufrufe.
Undefiniertes Verhalten
Beispiel 1: Dereferenzieren eines Null-Zeigers:
int *p = 0;
std:cout << *p;
Beispiel 2: Verweis auf ungültigen Array-Index:
char name[] = "Marla";
char c = name[10];
TR1
Technical Report 1: Spezifikation einer neuen Funktionalität der C++-Standardbibliothek. Beinhaltet Form neuer Klassen- und Funktionstemplates, etwa für Hashtabellen, intelligente Zeiger zur Referenzzählung, reguläre Ausdrücke, etc. Namespace: trl innerhalb std; d.h. std::trl. Basiert konzeptionell auf Boost (will Boost Bibl.-funktionalität in Standardlib).
Boost
Portierbare, geprüfte C++-Bibliotheken. Boost bietet mehr an als in TR1 deklariert.
1. Machen Sie sich mit C++ vertraut
Tipp 1: Betrachten Sie C++ als eine Kombination von Sprachen
Heute ist C++ eine Multiparadigma-Programmiersprache; eine Kombination aus prozeduralen, objektorientierten, funktionalen, generischen und metaprogrammatischen Eigenschaften unterstützt.
Beim Wechsel der Untersprache können sich die Regeln ändern. Untersprachen:
- C
- Objektorientiertes C
- Template-C++
- STL
Beispiel: Übergabe als Wert für integrierte Typen (C-artig) ist effizienter als als Verweis. In objektorientiertem C++ dagegen als const Referenz (Konstr., Destr.). Gilt vor allem auch für Template-C++, da dort nicht einmal der Typ des Objekts bekannt. Bei STL wiederum Wert (da diese Iteratoren und Funktionsobjekte auf Verweisen in C basieren).
„Die Regeln für eine effektive Programmierung in C++ ändern sich je nachdem, welchen Teil von C++ Sie einsetzen.“