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.“

Tipp 2: Ziehen Sie const, enum und inline gegenüber #define vor