Datentypen
Implizite Typumwandlung
- automatisches Casting bei Zahlen „von kleineren zu größeren“ Datentypen
Rangfolge:
unsigned long long ("größter Wert") long long long double double float unsigned long long unsigned (int) int short bool
- casting non const zu const, Referenzen
T->T& T&->T T->const T T*->const T* T&->const T&
Explzite Typumwandlung
- mit static_cast<>
- bei elementaren (einfachen) Datentypen
bool i = true; int y = static_cast<int> i; //y ist 1
- zu Konstanten casten, mit const_cast<>
- kritische Typumwandlung mit reinterpret_cast<>
struct A{} a; struct B{} b; struct A *pa = &a; struct B *pb = pa; //Fehler, nicht derselbe Datentyp, obwohl selber Struct-Inhalt struct B *pb = reinterpret_cast<B*>(pa); //ist ok
Inline Funktionen
- Performance Vorteile, kein kopieren der Übergabeparameter
- schwer zu debuggen bei Fehlern
- Funktionsaufruf wird substituiert durch Inhalt der Funktion durch Compiler
#define max(i,j) (i > j) ? i : j m = max(3, 4); //Compiler ersetzt zu: m = (3 > 4) ? 3 : 4;
Klassen
Der Vorteil von Klassen zu Strukturen (struct)
- Konstruktor/Destruktor automatisch ausgeführt, dort Speicherverwaltung, kann schwieriger vergessen werden
- bei Struct wird Speicher vom Compiler angelegt, new Class zur Laufzeit
- Vererbung möglich
- bei beiden Rechteverwaltung möglich mit private/public/protected
Speicher
class A{ int a;//existiert pro Object der Klasse int f();//ecistiert 1 mal insgesamt auf dem Stack A(){};//Konstruktor ~A(){};//Destruktor }
Namensgebung
- Memberfunktionen nicht benennen wie Membervariablen
class A{ int a;float a();}
Statische Member/Funktionen mit static
- sind einmal pro Klasse im Speicher
- existieren auch ohne Instanz von Objekten
- static Funktionen können nicht auf non-static Variablen und Funktionen zugreifen
class A{
static int a;//existiert einmal pro Klasse
}
int b = A::a; //ohne Objekt von A möglich
Initializer List für Konstruktoren
- nur bei Konstruktoren möglich
class A{ int a, b; A(int ai, int bi) : a(ai), b(bi){};//Konstruktor mit Initializer List }
entspricht:
class A{ int a, b; A(int ai, int bi){a = ai; b = bi}; }
Copy Konstruktor
- wird automatisch angelegt, kopiert Member Variablen
- Achtung, es werden die Adressen der Member Variablen kopiert, bei Änderungen sind beide Werte betroffen, wenn nicht erwünscht, Funktion überschreiben: A::A(const X&);
class A{ int a; } A einA; A zweiA (einA); //Copy Konstruktor //ODER A zweiA = einA; //Copy Konstruktor //ODER A zweiA A(einA); //Copy Konstruktor
Inhaltsverzeichnis:
Einführung in C++ – Vorteile, Compiler, Namespaces – Teil1
Einführung in C++ – Zeiger, Pointer,Referenzen – Teil2
Einführung in C++ – Datentypen, Casting, Klassen – Teil3
Einführung in C++ – Funktionen und Operatoren überladen (Overloading) – Teil4
Einführung in C++ – Klassen: Vererbung, Adjustment, Friends, abstrakt – Teil5