PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : objekt orienterung



alex
03-02-2003, 21:23
Hallo

Ich versuche gerade mich in die OO von C++ einzuarbeiten. Ich hab aber noch einige Probleme mit den Grundlagen der OO.
Also ein paar Fragen.

Was Klassen sind weiß ich so ungefähr, aber was sind Instanzen?
Als was bezeichnet man ein Objekt? Ist eine struct auch schon ein Objekt?
Welche Vorteile hat die OO?
Was sind Templates?
Was ist Klassenvererbung und Polymorphie?
Und wie funktioniert das Überladen?

So .. ich glaub das war's erstmal .. danke

anda_skoa
03-02-2003, 21:51
Original geschrieben von alex
Hallo

Ich versuche gerade mich in die OO von C++ einzuarbeiten. Ich hab aber noch einige Probleme mit den Grundlagen der OO.
Also ein paar Fragen.


Gleich so viele :eek:



Was Klassen sind weiß ich so ungefähr, aber was sind Instanzen?


Eine Instanz ist die Realisierung einer Klasse.
Wenn man das vergleicht, wäre eine Klasse zum Beispiel eine Schablone und die Instanz das nach dieser Schablone erstellte Werkstück.



Als was bezeichnet man ein Objekt? Ist eine struct auch schon ein Objekt?


Ein Objekt ist ansich etwas greifbares, dass Eigenschaften hat.
In der OOP meint man damit meist eine Instanz einer Klasse, aber aich ein int wäre ein Objekt, nur halt nicht im OOP Sinne.

Zur struct:
in C++ ist zwischen struct und class fast kein Unterschied.
Wenn keine Rechteeinschränkungen (public, protected, private) vergeben werden, dann ist in einer struct alles public, in einer Klasse private.
Sonst sind sie gleich.

Oder als Code ausgedrückt


struct A{
int a;
};

// ist äquivalent zu

class A {
public:
int a;
};




Welche Vorteile hat die OO?


Es erleichtert die Abbildung der Realität in eine Software Modell.
In der realen Welt besteht alles aus Objekte, die Eigenschaften besitzen und auf die man bestimmte Aktionen anwenden kann.

Diese Objekte gehören meist einer Klassenhierachie an, die gemeinsame Eigenschaften und Aktionen abstrak beschreibt.
Beispiel:
Männer und Frauen sind Unterklassen von Menschen.
Menschen sind eine Unterklasse von Säugetieren.
Jeder Mensch ist entweder eine Instanz von Mann oder eine Instanz von Frau, aber in jedem Fall hat er die Eigenschaften von Mensch und von Säugetier.

Die OOP erlaubt es, dieses praktisch natürliche Prinzip des Zusammenfassens von Eigenschaften und Aktionen auf Software zu übertragen.

Da Software meist ein Problem der realen Welt lösen soll, kann das Problem dadurch leichter in Software modelliert werden.



Was sind Templates?


Das sind generische Schablonen, um Funktionen oder Klassen zu definieren und zu erzeugen.
Das ist ein bischen ein komplizierteres Gebiet, lässt sich nicht so einfach erklären.
Der Gedanke dahinter ist, dass man etwas allgemeines beschreibt, dass erst zusammen mit einem Datentyp realsiert wird.



Was ist Klassenvererbung und Polymorphie?


Vererbung bedeuete, dass eine Klasse die Eigenschaften und Aktionen (Funktionen bzw. Methoden) von einer zuvor deklarieren Klasse übernimmt.
So wie Mensch die Eigenschaften von Säugetier erbt.



Und wie funktioniert das Überladen?


eine Form der Polymorphie.
Eine Methode(Funktion) einer Klasse existiert in verschiedenen Formen, also mit gleichem Namen aber verschiedenen Parametern.



class A {
int a;
public:
void setA(int a);
void setA(char a);
void setA(float a); // diese Methode müsste intern runden
};


Der Compiler nimmt bei einem Aufruf immer die Methode, deren Form am besten passt.

Ciao,
_

alex
04-02-2003, 17:04
Aha. Danke für die antworten anda_soka!

Aber ich habe noch einige Fragen zu Klassen. In ihnen können ja auch Funktionen beschrieben werden, heißt dass dann wenn ich private Variablen in der Klasse habe, dann können die Methoden der Klassen auch ohne irgendwelche übergebenen Parameter auf diese Variablen zugreifen?

anda_skoa
04-02-2003, 17:26
Ja, können sie.

Eine Klasse ist ein abstrakter Datentyp, der einen Inhalt hat und auf dem Funktionen definiert sind.
Die Funktionen, in diesem Fall Methoden genannt, sind genau so Teil der Klasse, wie der Inhalt und können daher darauf zugreifen.

Aufpassen muss man, wenn eine Methode als static deklariert ist.
Dann kann sie nur auf Variablen zugreifen, die auch static deklariert sind.

static bedeutet hier, dass diese Funktionen und Variablen ohne eine Instanz der Klasse funktionieren.

Ciao,
_

JoelH
05-02-2003, 11:19
Original geschrieben von anda_skoa

static bedeutet hier, dass diese Funktionen und Variablen ohne eine Instanz der Klasse funktionieren.
_

bzw. für jede Instanz der Klasse gleich sind.zB. kannst du dir mit einer Klassenvariable (also einer static Variable) die Möglichkeit schaffen um zu schaun wieviele Instanzen wärend des Programmablaufs gerade da sind. Einfach im Konstruktor diese Var um eins erhöhen und den Destruktor diese Variable um eins erniedrigen lassen, dann haste in der Variable immer die Anzahl der momentan erzeugten Instanzen der Klasse. usw.

alex
05-02-2003, 12:48
Ja danke. Aber was sind Konstruktoren bzw. Destruktoren?

Lin728
05-02-2003, 15:25
Servus!


Nun, Konstruktoren sind spezielle Funktionen in einer klasse, die aufgerufen werden, wenn das object mit new erzeugt wird.

Der destruktor wird aufgerufen, wenn das object mit delete wieder gelöscht wird.

Wie das mit objecten aussieht, die auf den Stack aussieht, kann ich dir leider nicht sagen, Hängt wahrscheinlich mit der Sichbarkeit ab, aber bei C++ weiß man das nie genau ;-)

tuxipuxi
05-02-2003, 16:38
konstruktoren/destruktoren werden auch bei einer "normalen" erzeugung auf dem stack aufgerufen.

ReSeT
05-02-2003, 17:28
Wie das mit objecten aussieht, die auf den Stack aussieht, kann ich dir leider nicht sagen, Hängt wahrscheinlich mit der Sichbarkeit ab

Die "Sichtbarkeit" eines Objektes hängt sicherlich nicht davon ab, ob es auf dem Stack oder dem Heap erzeugt wird.


aber bei C++ weiß man das nie genau

Man ganz klar bestimmen wo was passiert und zwar aufs letzte Bit. Wenn man natürlich C++ dazu benutzt, um sprachliche Unklarheiten zu konstruieren ist man es doch selber Schuld oder? Das ist jetzt nicht als persönlicher Angriff zu verstehen. ;)

anda_skoa
05-02-2003, 17:45
Es können von "außen" nur Konstruktoren benutzt werden, die public sind.
Protected oder Private Ctors :cool: können nur von abgeleiteten Klasse, respektive der Klasse selbst benutzt werden.

Es gibt einen speziellen Konstrukor, den Copy Konstruktor.
Der wird benutzt, wenn ein Objekt aus einer anderen Instanz initalisiert wird.

Wenn man in der Klasse Pointer auf Datenbereiche hat, die man in der Klasse nagelegt hat und dort auch löschen wird, muss man den Copy Ctor überschreiben, denn die Defaultimplementation kopiert sonst nur den Pointer.

Beispiel


class A
{
int m_a;

public:
A() { m_a = 0; } // sogenannter Defaultconstructor
A(int a) { m_a = a; } // normaler Constructor
A(const A& other) { m_a = other.m_a; } // Copy constructor
};

A a1; // Default Constructor wird benutzt
A a2(1234); // normaler Constructor
A a3(a2); // Copy Ctor
A a4 = a2; / auch copy ctor


Ciao,
_

f0rtex
05-02-2003, 17:52
@anda_skoa:
AFAIK ist der Default C-Ctor ein bitweises Kopieren und nicht nur ein Umhängen von Pointern.

greets
f0rtex

anda_skoa
05-02-2003, 19:12
Original geschrieben von f0rtex
@anda_skoa:
AFAIK ist der Default C-Ctor ein bitweises Kopieren und nicht nur ein Umhängen von Pointern.


das hab ich doch mehr oder weniger gesagt.
Es wird eben ur der Pointer kopiert, aber nicht das, worauf er zeigt.
Dadurch hat man zwei Pointer auf den selben Bereich.

Ciao,
_

JoelH
06-02-2003, 12:34
Ich glaub jetzt habt ihr ihn verschreckt ;)

tuxipuxi
08-02-2003, 14:00
Original geschrieben von anda_skoa

Protected oder Private Ctors :cool: können nur von abgeleiteten Klasse, respektive der Klasse selbst benutzt werden.


hm bist du dir sicher?
ich glaube das abgeleitete klassen nicht auf private konstruktoren zugreifen koennen, oder taeusch ich mich?

JoelH
08-02-2003, 14:11
seit wann werden Konstruktoren vererbt ?

tuxipuxi
08-02-2003, 14:43
Original geschrieben von JoelH
seit wann werden Konstruktoren vererbt ?

werden sie nicht.
aber wenn eine instanz einer abgeleiteten klasse erzeugt wird, werden die konstruktoren der reihe nach von basisklasse zu abgeleiteter klasse aufgerufen.

anda_skoa
08-02-2003, 15:26
Original geschrieben von tuxipuxi
hm bist du dir sicher?
ich glaube das abgeleitete klassen nicht auf private konstruktoren zugreifen koennen, oder taeusch ich mich?

Ja, ich bin sicher :)
Ich hab nämlich was anderes geschrieben.

Das steht "Protected und Private .... abgeleiteten Klasse, respektive der Klasse selbst
:D

Ciao,
_