Ohne Zeiger kein Polymorphismus
S. Freud
Problem: Wie initialisiert man Reihungen von Objekten?
Antwort: Mit Konstruktoren in den
geschweiften Klammern
#include "meineKlasse.h"
int main(void) {
meineKlasse Objekt[5] = {meineKlasse(1), meineKlasse(2), meineKlasse(3), meineKlasse(4), meineKlasse(5)};
...
}
meineKlasse Objekt[5] = {1,2,3,4,5};
Auch möglich hier:
Sind wie Zeiger auf struct in C++ zu schreiben
Jedes Objekt besitzt einen besonderen Zeiger: this
this ist die Speicheradresse des Objekts
Typ ist Zeiger auf Klassentyp i. A.
Typ ist Zeiger auf konstanten
Klassentyp für const Klassen
class Reihung{
...
public:
Reihung copy(const Reihung&);
}
Reihung& Reihung::copy(const Reihung & rhs) {
if (this != &rhs){
groesse = rhs.groesse;
... //Feigling }
return *this;
Man achte auf den Fall für Selbst- Kopierung
Das Ergebnis ist die Kopie, d.h.
das Objekt, auf das kopiert wird
friend -Funktionen haben keine
Zugriffsberechtigung auf this
Wie immer, mit new
Dynamische Erzeugung von
Objekten verursacht Aufruf von Konstruktoren
Selbstgestrickte new gibt es auch
<p_var> = new <Typ>{[Groesse]}{(<InitWert>)}
delete {[]}<p_var>
Normalerweise mit new allozierter Speicher wird nicht initialisiert (wie malloc())
Initialisierung durch Konstruktoren
Reihungen können nicht so
initialisert werden (siehe oben)
delete ruft den Destruktor auf
Ohne Initialisierung
#include "meineKlasse.h"
int main(void){
meineKlasse *p = new meineKlasse;
if (!p){... return 0;}
p->setn(1);
...
delete p;
return 1;
}
mit Initialisierung
#include "meineKlasse.h"
int main() {
meineKlasse *p = new meineKlasse(5);
...
delete p;
return 0;
}
Allozierung von Reihungen von Klassen
#include "meineKlasse.h"
#include <iostream>
using namespace std; //ugh int main(void)
{
meineKlasse *p = new meineKlasse[20];
for (int i = 0; i < 20; i++) p[i].setn(i+1);
for (int i = 0; i < 20; i++) cout << p[i].getn()
<< endl;
delete[] p;
return 0;
Reihungsgrenzen können auch erst zur Laufzeit bekannt sein Dynamische Allozierung von
const Objekten auch möglich, z.B.
const float *p = new const float(3.14);
Bei
deletefür Reihungen von Klassenobjekten werden
Destruktoren aufgerufen
#ifndef _meineKlasse
#define _meineKlasse
#include <iostream>
using namespace std;
classe meineKlasse{
private:
int n;
public:
meineKlasse(){n = 0;}
meineKlasse(int m){n = m;}
~meineKlasse(){cout << "Destruktor aufgerufen" << endl;
int getn();
int getn() const;
void setn(int);
};
#include "meineKlasse.h"
int main(void) {
meineKlasse *p = new meineKlasse [10];
if (!p) ...
for (int i = 0; i < 10; i++)p[i].setn(2*i);
for (int j = 0, j < 10; j++) cout << p[j].getn() << " ";
cout << endl;
delete [] p;
return 0;
}
!
0 2 4 6 8 10 12 14 16 18 Destruktor aufgerufen
Destruktor aufgerufen Destruktor aufgerufen Destruktor aufgerufen Destruktor aufgerufen Destruktor aufgerufen Destruktor aufgerufen Destruktor aufgerufen Destruktor aufgerufen Destruktor aufgerufen