OOP - Begriffserklärungen
-
Cyres schrieb:
Das Gebilder heißt nicht "Absoluter Datentyp" sondern "Abstrakte Datentyp".
Ja, heißt "Abstrakter Datentyp". Wer lesen kann ist klar im Vorteil *Kopf gegen die Wand schlag*
Danke Cyres
-
Im Buch der "C++ Programmierer" steht unter 4.2 Klassen und Objekte folgender Absatz.
`Eine Klasse ist ein Datentyp, genauer: ein Abstrakter Datentyp, der in einer Programmiersprache formuliert ist. Eine Klasse ist auch die Beschreibung von Objekten oder, anders ausgedrückt, die Abstraktion von ähnlichen Eigenschaften und Verhaltensweisen ähnlicher Objekte. Eine Klasse definiert die Struktur aller nach ihrem Muster erzeugten Objekte. In C++ dient die Klasse dazu, dem Compiler die Beschreibung von später definierten Objekten mitzuteilen.
Ein Objekt hat einen inneren Zustand, der durch ndere Objekte oder Elemente der in der Programmiersprache vorgegebenen Datentyp dargestellt wird. Der Zustand kann sich durch Aktivitäten des Objektes ändern, das heißt, durch Operationen, die auf Objektdaten ausgeführt werden. Die von jedem benutzbaren Operationen bilden die öffentliche Schnittstelle, in C++ gekennzeichnet durch public.`
Habe ich es richtig verstanden, wenn ich es in eigenen Worten wie folgt formuliere:
Also eine Klasse ist in C++ ein Datentyp. In einer Headerdatei wird diese Klasse wie folgt definiert:
class <Klassennamen> { public: //Anweisungen private: //Anweisungen };Eine Klasse dient dazu, dem Compiler die Beschreibung von später zu definierenden Objekten mitzuteilen.
Objekte haben zwar einen inneren Zustand, aber wenn sie zu ändern sind, dann sind sie als
publicdeklariert.Habe ich es richtig verstanden??
Gruß
Max
-
silent_max schrieb:
Also eine Klasse ist in C++ ein Datentyp. In einer Headerdatei wird diese Klasse wie folgt definiert:
class <Klassennamen> { public: //Anweisungen private: //Anweisungen };Eine Klasse dient dazu, dem Compiler die Beschreibung von später zu definierenden Objekten mitzuteilen.
Genau. Wobei ich innerhalb der Klassendefinition nicht von Anweisungen, sondern von Deklarationen sprechen würde.
int i; // Deklaration i = 4 + 2; // Anweisung funktion(i); // Anweisungsilent_max schrieb:
Objekte haben zwar einen inneren Zustand, aber wenn sie zu ändern sind, dann sind sie als
publicdeklariert.Objekte selbst sind nicht public oder private, sondern ihre Member (Variablen und Funktionen).
publicheisst, dass die danach aufgelisteten Member öffentlich sind und von überall her benutzt werden können, währendprivate-Member nur Zugriff innerhalb der Klasse erlauben.
-
Mit Kapselung ist gemeint, dass bestimmte Eigenschaften von Objekten nicht von außen verwendet werden können.
Alle Variablen und Funktionen, die in public stehen können frei verwendet werden. Die Daten, die in private stehen, können nur von anderen Methoden der Klasse verwendet werden.
Beispiel:
class EineKlasse { public: void macheEtwas(); int fehlercode() { return fehler; } private: int fehler; };Hierbei kann die Methode macheEtwas die Variable fehler setzen und auslesen. Über die Methode fehlercode kann man von außen feststellen, ob es einen Fehler gab, man kann aber sinnvollerweise den Fehlercode nicht selber verändern.
Sollte sich hier irgendwo ein Bug einschleichen und die Variable fehler auch dann setzen, wenn es keinen gab, kann man sicher sein, dass der Fehler nur in den Methoden von EineKlasse sein kann. Ohne Datenkapselung hätte die Variable an jeder Stelle des Codes verändert werden können, man müsste also überall nach Fehlern suchen.
-
Hallo und guten Abend liebe Gemeinde.
Ich habe mir jetzt für mich das Wichtigste aus „Der C++ Programmierer“ und aus Wikibooks bzgl. Klassen raus geschrieben. Ich will nur wissen, ob ich bzgl. der Begriffe richtig liege. Also los im Text… wenn ich falsch liege bzw. etwas vergessen habe, dann korrigiert mich bitte…Abstrakter Datentyp
Um unzulässige Zugriffe und damit auch versehentliche Fehler zu vermeiden, sollten die Daten gekapselt werden, indem man zusammengehörige Daten und Funktionen zusammenfasst. Das dadurch entstehende Gebilde heißt abstrakter Datentyp. Der Sinn liegt darin, den richtigen Gebrauch der Daten sicherzustellen.
Merke: Abstrakter Datentyp = Datentypen + Funktionen
Die zusammen mit Daten gekapselten Funktionen heißen Elementfunktionen (englisch member functions). Der Zugriff auf die Daten soll nur über Elementfunktionen(auch Methoden genannt) möglich sein. Die Begriffe Methoden und Elementfunktionen werden synonym verwendet, genauso wie Daten und Attribute.
Die Daten werden, unterstützt durch die Programmiersprache, so gekapselt, dass ein Zugriff ausschließlich über eine Funktion geschieht. Abbildung 1 verdeutlicht das Prinzip. Die Funktion als öffentliche Schnittstelle gehört zur Datenkapsel und ist der einzige Zugang. Eine direkte Änderung der Daten unter Umgehung der Funktion ist unmöglich
Klassen und ObjekteEine Klasse ist die Abstraktion von ähnlichen Eigenschaften und Verhaltensweisen ähnlicher Objekte. Sie definiert die Struktur aller nach ihrem Muster erzeugten Objekte. Eine Klasse besteht in C++ aus zwei Quellcode – Dateien:
> Deklaration
> ImplementationDie Deklaration erfolgt üblicherweise in einer Header-Datei. Bei der Deklaration einer Klasse werden ihre Elemente (members, das umfass Daten und Funktionen) festgelegt.
Die Syntax einer Klassendeklaration lautet wie folgt:
class Klassenname { public: Typ elementfunktion1(); Typ elementfunktion2(); //und weitere private: Typ attribut1; Typ attribut2; //und weitere };Um es an einem konkreten Beispiel fest zu machen, folgt nun ein Beispiel:
class EineKlasse { public: //öffentlich EineKlasse(); //der Default-Konstruktor EineKlasse(int a=0); //weiterer Konstruktor mit Parameter u. Defaultwert EineKlasse(const EineKlasse &a);//Copy Konstruktor ~EineKlasse(); //der Destruktor int eineFunktion(int x=42); //eine Funktion mit einem (Default-)Parameter private: //private int m_eineVariable; }Die erste Zeile gibt der Klasse den Namen.
Im Klassenrumpf werden die Elemente deklariert. Die Reihenfolge der Member – Deklaration ist beliebig. Abschließend folgt eine geschweifte Klammer und ein Semikolon.
Die von jedem benutzbaren Operationen bilden die öffentliche Schnittstelle, in C++ gekennzeichnet durch das Schlüsselwort
public. Ein Objekt ist die konkrete Ausprägung einer Klasse, es belegt im Gegensatz zur Klasse Bereiche im Speicher, die mit definierten Bitmustern belegt sind, die Werte von Objekteigenschaften. Eigenschaften werden auch Attribute genannt, die bestimmte Werte besitzen. Der Zustand eines Objektes, der durch die zu den Attributen gehörenden Werte beschrieben wird, ist im Sinne des abstrakten Datentyps nicht direkt änderbar sondern nur über öffentliche Methoden. Die Attribute werden deshalb normalerweise mit dem Schlüsselwortprivatedeklariert.Implementierung
Die Implementierung, d. h. der Code für die jeweiligen Memberfunktionen, erfolgt in einer C++ - Datei.
Um die Funktioninteine Funktion(int x=42); zu implmentieren, schreibt manint EineKlasse::eineFunktion(int x) { //Anweisungen }Dabei wird vor den Funktionsnamen eineFunktion noch der Name der Klasse EineKlasse gefolgt von zwei Doppelpunkten gestellt. Dies qualifiziert die Funktion, so dass der Compiler weiß, zu welcher Klasse die Funktionsdefinition gehört. Zu beachten ist, dass die Default-Initialisierung des Parameters hier nicht wiederholt wird.
Teile einer Klasse
Eine Klasse setzt sich aus verschiedenen Teilen zusammen:
> Konstruktor
> Destruktor
> Memberfunktion
> MembervariableDer Konstruktor
Konstruktoren werden bei der Erschaffung einer Instanz einer Klasse aufgerufen und dienen dazu, Initialisierungen auszuführen, etwa Membervariablen Standardwerte zuzuweisen.
Die Funktionsdefinition beginnt mit dem Namen der Klasse. Er hat keinen Rückgabewert, kann aber einen oder mehrere Parameter besitzen.Bsp. 1:
EineKlasse::EineKlasse() :m_eineVariable { //weitere Initialisierungen des Objektes }Bsp. 2:
EineKlasse::EineKlasse(int a) :m_eineVariable(a) { //weitere Initialisierungen }Der Destruktor
Der Destruktor trägt ebenfalls denselben Name wie die Klasse aber mit einer vorgestellten Tilde ~. Er hat keinen Rückgabewert und keinen Paramter. Der Destrukter wird aufgerufen, wenn eine Instanz der Klasse zerstört wird. Das passiert, wenn der Bereich (z. Bsp. Ein Funktionsrumpf), in dem die Klasse lokal instanziert wird, endet oder der Operator delete für die Instanz aufgerufen wird.
Im Destuktor können also abschließende Aktionen unternommen werden, z. Bsp. reservierter Speicherplatz freigegeben wird, oder andere Objekte davon unterrichtet werden, dass es die Instanz ab jetzt nicht mehr gibt. Oft bleibt der Destruktorrumpf aber auch leer.
Bsp.:
EineKlasse::~EineKlasse() { }Memberfunktionen
Memberfunktionen sind innerhalb einer Klasse deklarierte Funktionen. Die Implentierung geschieht wie auch bei Konstruktoren und Destruktoren in der Quelldatei EineKlasse.cpp
Bsp.:
int eineKlasse::eineFunktion(int a) { int ergebnis = m_eineVariable *a; cout << "Ergebnis: " << ergebnis << endl; return ergebnis; }In diesem Beispiel wir der Parameter mit der Membervariable multipliziert und auch als Funktionswert zurückgegeben.
Membervariablen
Für Membervariablen gilt wie für Memberfunktionen, dass sie innerhalb der Klasse nur mit ihrem Namen angesprochen werden, von außerhalb mit dem Namen der Instanz qualifiziert werden müssen.
Zugriffskontrolle
Ein grundlegendes Konzept von OPP ist die Datenkapselung, die in C++ mit den Schlüsselwörtern private, protected und public gesteuert wird. Wenn kein Schlüsselwort angegeben wird, ist die definierte Variable bzw. Methode automatisch private. Um ein Element öffentlich zugänglich zu machen, deklariert man es als public.
Die Unterscheidung, welche Member welchen Zugriffsschutz bekommen, nehmen Sie in der Deklaration der Klasse vor:class EineKlasse { public: int liesGeheimnis() const; protected: void bestimmeGeheimnis(int Wert); private: int geheimnis; };public
Auf diese Elemente ist aus jeder Codepassage heraus Zugriff erlaubt.
protected
Auf Elemente dieser Zugriffschutz – Stufe besteht Zugriff von Codeteilen, die
> Entweder die Klasse implementieren
oder
> für solche, die Klassen implementieren die direkt oder indirekt von der Klasse erbenprivate
Diese Elemente sind nur aus Codeteilen heraus zugreifbar, die der Implementierung dieser Klasse dienen, üblicherweise also Methoden-Implementierung
-
Nur ein paar Kleinigkeiten:
EineKlasse(); //der Default-Konstruktor EineKlasse(int a=0); //weiterer Konstruktor mit Parameter u. DefaultwertDas wird nicht kompilieren. Der Compiler weiß bei der Erzeugung eines Objektes ohne explizite Argumente nicht, ob der Default-Konstruktor oder der mit Parameter aufgerufen wird, da beide (wegen dem Defaultwert) als Default-Konstruktoren behandelt werden können.
Destruktor brauchst du übrigens nicht zu deklarieren, wenn die Definition eh leer bleibt. Der Compiler macht das automatisch. Solange alle Elemente copyable sind, wird auch der Copy-Konstruktor (genauso wie die Zuweisung) vom Compiler generiert.
Siehe dazu auch die Regel der großen Drei.
Hast du schon etwas über inline-Funktionen gelesen/gehört? Kleiner Memberfunktionen können direkt in der Klasse definiert werden, was u.U. effizienter ist.
-
...
-
Entschuldige ... ich habe es nicht besser gewusst.
Dann werde ich ab morgen einmal die Theorie anwenden...
-
Nathan schrieb:
.
Hast du schon etwas über inline-Funktionen gelesen/gehört? Kleiner Memberfunktionen können direkt in der Klasse definiert werden, was u.U. effizienter ist.Ja, von inline Funktionen habe ich im C++ Buch gelesen, aber ich habe es nicht als wichtig genug erachtet...
-
...
-
Swordfish schrieb:
Du brauchst dich doch nicht entschuldigen. Natürlich steht dir frei zu tun und zu lassen was du willst!? Die Erfahrung hat lediglich gezeigt, daß man programmieren nur durch programmieren lernt.

Ja, ist mir schon klar, dass man das Programmieren nur durch programmieren, programmieren und nochmals programmieren lernt...
Bloß ohne der Theorie - also z. B. das, was ich mir bzgl. der Klassen erarbeitet habe - ist es bisschen blöd es in die Praxis umzusetzen. Denk ich mir halt.
Bitte sei mir nicht bös Swordfish, ich will Dir nichts unterstellen, aber ich dachte aufgrund Deines vorletzten Postings, dass Du bisschen angepisst warst, dass ich so viel "Theorie" auf einmal gepostet habe...
-
Jetzt entschuldigt er sich doch glatt dafür dass er sich entschuldigt hat...

-
...
-
silent_max schrieb:
Im Buch der "C++ Programmierer" steht unter 4.2 Klassen und Objekte folgender Absatz.
`Eine Klasse ist ein Datentyp, genauer: ein Abstrakter Datentyp, der in einer Programmiersprache formuliert ist. Eine Klasse ist auch die Beschreibung von Objekten oder, anders ausgedrückt, die Abstraktion von ähnlichen Eigenschaften und Verhaltensweisen ähnlicher Objekte. Eine Klasse definiert die Struktur aller nach ihrem Muster erzeugten Objekte. In C++ dient die Klasse dazu, dem Compiler die Beschreibung von später definierten Objekten mitzuteilen.
Ein Objekt hat einen inneren Zustand, der durch ndere Objekte oder Elemente der in der Programmiersprache vorgegebenen Datentyp dargestellt wird. Der Zustand kann sich durch Aktivitäten des Objektes ändern, das heißt, durch Operationen, die auf Objektdaten ausgeführt werden. Die von jedem benutzbaren Operationen bilden die öffentliche Schnittstelle, in C++ gekennzeichnet durch public.`
irgendwo hab ich mal etwas gelesen und das ging ca. so:
wenn man etwas nicht einfach erklären kann hat man es selber nicht ganz verstanden.
so oder so ähnlich, das gibt es als zitat einer berühmten persönlichkeit.was ich damit sagen will ist das ich denke es wäre nicht unvernünftig das buch mal weg zu legen und ein anderes zur hand zu nehmen.
-
+1
-
Nichts für ungut:
- ich habe heute mit dem Lesen eines Buches angefangen
- ich verstehe da einen Begriff nicht
- ich frage hier im Forum
Was soll das?
Lese das Buch weiter, probiere die Beispiele selbst aus, oder lass es einfach sein!
-
kurze_anmerkung schrieb:
was ich damit sagen will ist das ich denke es wäre nicht unvernünftig das buch mal weg zu legen und ein anderes zur hand zu nehmen.
Nein. Das Buch ist erstmal das beste für silent_max.
Stell Dir vor, sie käme an Wolf!!! Das wäre irreparabel.
-
volkard schrieb:
sie
silent_max ist ne sie?
-
hustbaer schrieb:
volkard schrieb:
sie
silent_max ist ne sie?
Keine Ahnung, hab mal gewürfelt.
-
volkard schrieb:
hustbaer schrieb:
volkard schrieb:
sie
silent_max ist ne sie?
Keine Ahnung, hab mal gewürfelt.
Wenn er eine sie ist, sollte der Name besser gewählt werden. Als sie wird man glaube ich hier besser versorgt.