Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Thema: Konstruktor/Destruktor

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
11.05.2004, 16:20 Uhr
chrisuni



Also ich habe mal wieder ein Verständnissproblem.. Bin gerade mitten im Kapitel Klassen drinnen und habe jetzt verstanden warum ich und wie ich Methoden/ Funktionen/ Variablen als private /public definiere... Nun hab ich hier aber folgende Vorlage:


C++:
#include <iostream>
using namespace std;

class Cat
{
private:
int itsAge;
public:
Cat(int initialAge); //Konstruktor
~Cat();               //Destruktor
int getAge();
int setAge(int age);
void miau();
};

Cat::Cat(int initialAge)     //Konstruktor
{
itsAge = initialAge;
}

Cat::~Cat()                  //Destruktor
{
}


int Cat::getAge()
{return itsAge;}

int Cat::setAge(int age)
{itsAge = age;}

void Cat::miau()
{cout <<"\nMIAU";}

int main()
{

Cat Brandy(5);
Brandy.miau();
cout <<"\nBrandy ist " << Brandy.getAge()<<" Jahre alt!";
Brandy.miau();
Brandy.setAge(7);
cout <<"\nBrandy ist jetzt " << Brandy.getAge() <<  " Jahre alt!";
return 0;
}





1.Nun das was ich nicht verstehe ist... unter public wird int initialAge definiert und daraus wird auf einmal ein Konstruktor (oder wird wenn ich keinen Kons/Destr benutze dieser Standartkonstruktor genommen, den man gar nicht sehen kann im code?)!?
2.müsste ich dann nicht auch die nachfolgenden funktionen : Cat(int getAge) ~Cat(); Cat(void setAge) ~Cat(); etc. auch einen Konstruktor und Destruktor benutzen ???

3.Ist ein Konstruktor jetzt nur dafür da um eine variable zu initialisieren ?bspw.:
Normal (keine Klasse): int i;
In einer Klasse : Klassenname(int i) ~Klassenname();


Hoffe mal einer von euch versteht was ich meine, vielleicht kann mir einer das mit dem Konstruktor und Destruktor, für so einen Anfänger wie mich mal ganz ausführlich erklären, so daß ich es verstehe...

Danke im Voraus
gruß chris
--
gruß chris

nehmts mir net übel ich bin nen Anfänger und seh manchmal den Wald vor lauter Bäumen nicht mehr ;)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
11.05.2004, 18:27 Uhr
typecast
aka loddab
(Operator)


1.) Unter public wird der Konstruktor Cat(int) definiert. Das heißt, dass du den Konstruktor mit einem int-Parameter aufrufen kannst. In der Implementation der Funktion siehst du, dass der übergebene Wert der Variablen itsAge zugewiesen wird.
Definierst du keinen eigenen Konstuktor, dann wird autmatisch der Standardkonstruktor angelegt. Du kannst auch den Konstruktor der Klasse aufrufen, von der du deine Klasse abgeleitet hast:

C++:
class Abgeleitet : public Alt
{
public:
   Abgeleitet() : Alt() {}
}



2.) Die Frage versteh ich leider nicht. Heißt eine Funktion (ohne Rückgabewert) wie deine Klasse, dann handelt es sich um einen Konstruktor. Ist der Name ~Klassenname() (wichtig ohne Parameter), dann handelt es sich um einen Destruktor.

3.) Du kannst in einem Konstruktor allen möglichen Sch*** machen. Aber er wird im sinnvollen Fall dazu benutzt die Klassenvariablen zu initialisieren :-)
--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
11.05.2004, 18:54 Uhr
~chrisuni
Gast


mhh ich versteh das alles nicht, wieso ich den konstruktor benutzen muss etc... kann mir einer nicht nen link schicken wo das Thema Konstruktor/Destruktor nochmal für "dummies" wie mich erklärt steht... so das ich es auch verstehen kann...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
11.05.2004, 19:51 Uhr
theosoft



@ chrisuni: ich versuchs mal so:
Wenn eine Instanz für eine Klasse gebildet wird, muss Speicherplatz für die Eigenschaften (Klassenvariablen) vom Betriebssystem angefordert werden usw.. Das macht der Konstruktor! Wenn kein Konstruktor programmiert wird, benutzt der Compiler den "default-Konstruktor" (du hast oben geschieben: den man im Code nicht sieht!).
Man kann aber einen eigenen Konstruktor schreiben, wenn man damit was machen will. S. o.: die Eigenschaften initialisieren (Anfangswerte zuweisen)!
btw. der Konstruktor ist die Methode, die keinen Rückgabewert hat und den gleichen Namen wie die Klasse.
Der Konstruktor wird aufgerufen, wenn eine Instanz der Klasse gebildet wird.

Viel Erfolg, Theo
--
ifS (immer fröhliches Schaffen)
theosoft

Dieser Post wurde am 11.05.2004 um 19:52 Uhr von theosoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
11.05.2004, 21:07 Uhr
~chrisuni
Gast


Jo ok.. aber warum muss ich dann keinen Konstruktor für:

C++:
int getAge();
int setAge(int age);
void miau();





diese Funktionen z.B. hier programmieren ?
Finde diese Thema äußerst schwer... also nochmal mit meinen Worten:
Ein Konstruktor hat kein Rückgabewert.. und ich benutze ihn nur in Klassen.
Er ist dazu da um Speicherplatz für die Variablen von Funktionen aus einer Klasse zu reservieren. Eine Instanz einer Klasse ist z.b in der Klasse Cat die katze "Peter" also : Cat.Peter; ist das so richtig ?. Nur wofür brauche ich jetzt diese selbst implementierten Konstruktoren, wenn der doch immer einen Standard konstruktor nutzen kann ....
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
11.05.2004, 22:45 Uhr
theosoft



Eine Instanz der Klasse Cat mit Namen Peter wird so deklariert:
Cat Peter(66);
Damit gibt's jetzt einen Peter, der 66 Jahre alt ist und Instanz der Klasse Cat.
Für die eigenschaften und Methoden gilt dann die Punktschreibweise.
z. B.: Peter.itsAge = 10
Ich habe mal einige K0ommentare in deinen Code geschrieben. Vielleicht hilft's dir.

C++:
#include <iostream>
#include <conio>      // fuer getch()

using namespace std;
// -------------- Deklarationen ----------------------
class Cat
{
  private:
    int itsAge;            // Eigenschaft Alter
  public:
    Cat(int initialAge);   // Konstruktor
    ~Cat();                // Destruktor
    int getAge();          // Methode zum holen des Alters
    void setAge(int age);  // Methode zum setzen des Alters
    void miau();           // Methode zur Ausgabe eines "MIAU"
};
// -------------- Implementationen --------------------
Cat::Cat(int initialAge)     // Konstruktor uebernimmt einen Integer
{
  itsAge = initialAge;       // der uebernommene Wert wird der Eigenschaft
                             // istAge zugewiesen
}

Cat::~Cat()                  //Destruktor macht nix
{
}

int Cat::getAge()
{
  return itsAge;             // gibt das alter zurueck
}

void Cat::setAge(int age)    // ich hab's void gemacht, weil's nix zurueckgibt
{
  itsAge = age;              // setzt das Alter
}

void Cat::miau()
{
  cout <<"\nMIAU";
}


int main()  // --------- Hauptprogramm ---------------------
{
  Cat Brandy(5);           // Instanz wird gebildet; 5 wird uebergeben !
  Brandy.miau();
   cout <<"\nBrandy ist " << Brandy.getAge()<<" Jahre alt!";
   Brandy.miau();
   Brandy.setAge(7);
   cout <<"\nBrandy ist jetzt " << Brandy.getAge() <<  " Jahre alt!";
   getch();                // damit das Fenster offen bleibt (je nach OS)
   return 0;
}


Viel Erfolg, Theo
--
ifS (immer fröhliches Schaffen)
theosoft
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
12.05.2004, 09:28 Uhr
chrisuni



@theosoft super vielen Dank nochmal habe das jetzt auch verstanden wie der Konstruktor funktioniert und das ich mir halt das setAge sparen kann.. bzw mit dem Konstruktor und Cat Brandy(5); kann ich ja Brandy den Wert 5 von Beginn an zuweisen und wenn sich das Alter dann verändert nutze ich setAge um das Alter zu verändern... Mir ist daran nur noch nicht klar warum ich nicht einfach den Konstruktor weglasse und nur setAge nutze... hast Du dazu mal ein einigermaßen simples Beispiel für mich, warum !! ich unbedingt einen Konstruktor nutze. Ich kann das Brandy ja genauso gut die Werte über setAge zuweisen.. Verstehst Du was ich meine ? Ich denke ich verstehe wie der Konstruktor funktioniert, aber ich verstehe nicht warum ich ihn überhaupt benutze wenn es doch auch anders geht...

so far gruß chris
--
gruß chris

nehmts mir net übel ich bin nen Anfänger und seh manchmal den Wald vor lauter Bäumen nicht mehr ;)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
12.05.2004, 09:39 Uhr
(un)wissender
Niveauwart


Es ist einfach und intuitiver die Werte im Konstuktor zu setzen, wenn möglich.
Außerdem befindet sich das Objekt gleich im legalen Zustand und kann benutzt werden.
Stelle dir mal vor, du hast eine tiefe Vererbungshierachie und müßtest alle Attribute selber setzen, ich mein, wenn du sonst nichts zu tun hast..., außerdem ist die Wahrscheinlichkeit, dass du eines vergisst zu setzen groß und dann gibt es einen undefinierten Zustand.
In deinem Beipspiel ist es noch recht egal, aber trotzdem solltest du den Konventionen folgen, die haben schon ihren Sinn.


Bearbeitung:

Konstante Member oder Objekte musst du sogar im Konstruktor bzw. besser noch in dessen Initialisierungsliste setzen.


--
Wer früher stirbt ist länger tot.

Dieser Post wurde am 12.05.2004 um 09:41 Uhr von (un)wissender editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
12.05.2004, 10:03 Uhr
theosoft



@(un)wissender: yep!
@chrisuni: Also klar, Konstruktor weglassen und set-Methode benutzen geht auch!
Man könnte es vergleichen mit:

C++:
int i;             // Variablendeklaration
i = 666;         // Wertzuweisung


das macht ja das gleiche wie:

C++:
int i = 666;    // Deklaration und Initialisierung


1. Fall analog zu Instanzenbildung ohne Konstruktor
2. Fall analog zu Instanzenbildung mit Konstruktor

Viel Erfolg, Theo
--
ifS (immer fröhliches Schaffen)
theosoft
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
12.05.2004, 10:36 Uhr
ao

(Operator)



Zitat:
theosoft postete
@chrisuni: Also klar, Konstruktor weglassen und set-Methode benutzen geht auch!

Nein! Bei *jeder* Instanzierung eines C++-Objekts wird ein Konstruktor aufgerufen, unvermeidlich! Die Deklaration von

C++:
Cat Brandy;

würde dafür sorgen, dass ein parameterloser Konstruktor aufgerufen würde (den es in Chris' Klasse nicht gibt -> Compilerfehler).
Es gibt keine Objektinstanz, die nicht konstruiert wurde.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: