Einführung in C++ – Datentypen, Casting, Klassen – Teil3


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)

  1. Konstruktor/Destruktor automatisch ausgeführt, dort Speicherverwaltung, kann schwieriger vergessen werden
  2. bei Struct wird Speicher vom Compiler angelegt, new Class zur Laufzeit
  3. Vererbung möglich
  4. 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