kramann.info
© Guido Kramann

Login: Passwort:










Informatik3
1 Vom_struct_zur_Klasse
..1.1 Vom_struct_zur_Klasse
..1.2 struct_Programm
..1.3 Klassen_Programm
..1.4 Offene_Fragen
..1.5 Historie
..1.6 Objektabstraktion
..1.7 OO_Kundenverwaltung
..1.8 Objektfaehigkeiten
..1.9 Formatierung
..1.10 Motivation
..1.11 Uebung1
..1.12 Uebung2
2 UML
..2.1 Volumenberechnung
..2.2 UML_Klassendiagramm
..2.3 Konstruktor
..2.4 Statische_Variable
3 Strings
..3.1 Klassenbibliotheken
..3.2 stringUML
..3.3 Uebung3
4 Initialisierungen
4 bluej
5 Zeiger_und_Arrays
..5.1 Zeiger
..5.2 Zeiger_und_Funktion
..5.3 Uebung4
6 Vererbung
..6.1 MesswerteUML
..6.2 MesswerteProgramm
..6.3 VererbungsProgramm
..6.4 Vector
..6.5 Uebung
7 Modifikatoren
..7.1 public_Vererbung
..7.2 protected_Vererbung
8 Listen_und_Templates
..8.1 Containertypen
....8.1.1 ListeUML
....8.1.2 ListeProgramm
..8.2 Templates
....8.2.1 Listentemplate
....8.2.2 STLvectorTemplate
..8.3 Uebung5
..8.4 Uebung6
..8.5 Uebung7
9 Java
..9.1 Uebung
..9.2 GettingStarted
..9.3 Animation
..9.4 Hybrid
..9.5 Threads
10 Delegation
11 LayoutProjekt
12 Fenster
13 Uebung
14 Zwischenprojekt
..14.1 Befehle
..14.2 Planung
..14.3 JNI
..14.4 JNIumsetzen
..14.5 Anwendungsklasse
..14.6 GUI01
..14.7 GUI02
15 Rasterlayout
..15.1 Bilder_Packages
..15.2 interfaces
..15.3 ArrayList
..15.4 clone
..15.5 Uebung
16 Nuetzliches
..16.1 Threads
..16.2 Animation
..16.3 RungeKutta
..16.4 Loesungsansatz
..16.5 Internetprogrammierung
....16.5.1 Codegenerierung
....16.5.2 PHP_Programmierung
....16.5.3 PHP_OOP
....16.5.4 Java
17 Algorithmen
..17.1 RungeKutta
..17.2 Loesungsansatz
..17.3 Evoopt
..17.4 Uebung12
..17.5 Uebung8_2014
..17.6 Ausdruecke
18 Uebung10
19 UML_ALT
..19.1 Flaechenberechnung
..19.2 UML_Flaechenberechnung
..19.3 Implementierung
..19.4 ListeUML
..19.5 ListenImplementierung
..19.6 Anwendung

5 Zeiger und Arrays bei Objekten



vorlesung_2013_11_14.zip - Während der Vorlesung am 14.11.2013 entwickelte Programme

  • Eine wesentlich größere Flexibilität in der Programmierung erreicht man durch die Verwendung von Zeigern und Arrays.
  • Auch bei Objekten ist es möglich, Zeiger auf sie verweisen zu lassen, oder Arrays von ihnen anzulegen.

Vorbetrachtungen

Call by Value bei der Übergabe von Objekten an Funktionen

  • Wenn Sie die Implementierung in Kapitel 3.9 genau anschauen, fällt Ihnen vielleicht folgendes auf:
  • Die Methode addRechteck(Rechteck r) sieht so aus, als würde es sich um ein "call by value" handeln.
  • Wenn Sie das mit entsprechendem Code überprüfen, werden Sie feststellen, dass das auch stimmt.
  • Testen Sie folgendes Programm:
#include<iostream>

using namespace std;

class Zahl
{
    public:
        int x;
    Zahl(int xx)
    {
        x = xx;
    }
};

class Zahlverwalter
{
  public:
    void zeigeX(Zahl z)
    {
        z.x++;
        cout<<z.x<<endl;
    }   
};

int main(void)
{
    Zahl z1(1),z2(2);
    Zahlverwalter v;

    v.zeigeX(z1);
    v.zeigeX(z2);

    cout<<z1.x<<endl;            
    cout<<z2.x<<endl;            
} 

Code 5-1: Call by value

2
3
1
2
 

Code 5-1b: Konsolenausgabe

  • Sie werden an der Ausgabe bemerken, dass die Inkrementierung nicht für z1 und z2 erfolgt ist, sondern nur für deren Kopien innerhalb der Funktion void zeigeX(Zahl z).
#include<iostream>

using namespace std;

class Zahl
{
    public:
        int x;
    Zahl(int xx)
    {
        x = xx;
    }
};

class Zahlverwalter
{
  public:
    void zeigeX(Zahl* z)
    {
        z->x++;
        cout<<z->x<<endl;
    }   
};

int main(void)
{
    Zahl z1(1),z2(2);
    Zahlverwalter v;

    v.zeigeX(&z1);
    v.zeigeX(&z2);

    cout<<z1.x<<endl;
    cout<<z2.x<<endl;
            
} 

Code 5-2: Call by reference (Zeigerübergabe)

2
3
2
3
 

Code 5-2b: Konsolenausgabe

Call by reference mit Hilfe von Zeigern

  • Bei der Übergabe von Zeiger auf Objekte an eine Funktion, können Sie die Objekte in der Funktion manipulieren.
  • Genau das ist Gegenstand der heutigen Vorlesung.

Referenzen als getarnte Zeiger

  • Es gibt noch eine dritte Möglichkeit in C++: die Verwendung so genannter Referenzen.
  • Referenz-Übergaben sehen aus wie Call by Value - Aufrufe, verhalten sich aber wie Zeiger.
  • In dieser Vorlesung werden wir Referenzen NICHT behandeln.
  • Trotzdem hier ein Programmbeispiel:
#include<iostream>

using namespace std;

class Zahl
{
    public:
        int x;
    Zahl(int xx)
    {
        x = xx;
    }
};

class Zahlverwalter
{
  public:
    void zeigeX(Zahl& z)
    {
        z.x++;
        cout<<z.x<<endl;
    }   
};

int main(void)
{
    Zahl z1(1),z2(2);
    Zahlverwalter v;

    v.zeigeX(z1);
    v.zeigeX(z2);
            
    cout<<z1.x<<endl;            
    cout<<z2.x<<endl;    
} 

Code 5-3: Call by reference (Referenzübergabe)

2
3
2
3
 

Code 5-3b: Konsolenausgabe