Forum: PC-Programmierung C++ Constructor


von Chris (Gast)


Lesenswert?

Hallo ich hätte mal ne frage:
Und zwar genau bei dem stelle die ich mit //hier kommentiert habe.

Warum kann ich beim Inizialisiern des Konstructors in der abgeleiten 
Klasse nach meinem Basisklassenconstructor meine zusätzlichen Instanzen 
die sich von der Basisklasse unterscheiden so inizialisiern 
nMusiker(nAnz) wenn ich garkeine geeignete Methode in der abgeleiteten 
Klasse habe die den Wert setzen würde? Bis jetzt habe ich es immer so 
gemacht {nMusiker= nAnz} Meiner Ansicht nach würde das nur funktionieren 
wenn ich eine geeignete Set-Methode hätte.

1
class Kammermusik : public Musikstueck
2
{
3
private: int nMusiker ;
4
public : Kammermusik ( char * szWer , char * szWas ,char * szWann , char * szDurMoll ,int nAnz )
5
: Musikstueck (szWer , szWas , szWann , szDurMoll ),nMusiker ( nAnz )//hier
6
{};
7
virtual void Ausgabe ()
8
{
9
Musikstueck :: Ausgabe ();
10
cout <<"\ nAnzahl Musiker : " << nMusiker <<"\n";
11
};
12
};

von Marcel (Gast)


Lesenswert?

Aber das "nMusiker ( nAnz )" ist doch identisch mit dem nMusiker= nAnz. 
Und warum solltest du in der Klasse selber eine Set-Methode verwenden 
müssen? Alle Daten innerhalb das Klasse sind doch eh sichtbar.

von Karl H. (kbuchegg)


Lesenswert?

Chris schrieb:

> die sich von der Basisklasse unterscheiden so inizialisiern
> nMusiker(nAnz) wenn ich garkeine geeignete Methode in der abgeleiteten
> Klasse habe die den Wert setzen würde?

Weil nMusiker ein Member dieser Klasse ist, und natürlich jede Funktion 
dieser Klasse auf die Datenmember derselben Klasse zugreifen kann. Sonst 
wär das alles ja ein wenig sinnlos.

> gemacht {nMusiker= nAnz} Meiner Ansicht nach würde das nur funktionieren
> wenn ich eine geeignete Set-Methode hätte.

Das ist ja auch kein Funktionsaufruf.
Das ist eine Initialisierung. Genauso wie

  int i(5);

eine Initialisierung ist und i mit 5 initialisiert.

> Bis jetzt habe ich es immer so
> gemacht {nMusiker= nAnz}

Das ist dann aber keine Initialisierung mehr, sondern eine Zuweisung.
In C++ ist das ein fundamentaler Unterschied.

von Chris (Gast)


Lesenswert?

okay ich habe mit {nMusiker= nAnz;} nur den Wert zugewiesen und mit
nMusiker ( nAnz ) ist es eine Inizialisierung.
Mir war die Schreibweise des Elementeninizialisierer mit  int i(5); 
leider nicht bekannt...

Das mit dem Zugriff in einer Klasse ist mir bekannt. Mir ist trotzdem 
noch nciht gnaz klar wuarm ich hier eine Inizialisierung mache.

ist in meinem Beispiel

>private: int nMusiker ;

kein Initzialisierung?

gruß Chris

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Repariere bitte Deine Tastatur.

Chris schrieb:
> ist in meinem Beispiel
>
>>private: int nMusiker ;
>
> kein Initzialisierung?

Nein, oder siehst Du da einen Wert, mit dem nMusiker ini_T_ialisiert 
wird?

von Karl H. (kbuchegg)


Lesenswert?

Chris schrieb:
> okay ich habe mit {nMusiker= nAnz;} nur den Wert zugewiesen und mit
> nMusiker ( nAnz ) ist es eine Inizialisierung.
> Mir war die Schreibweise des Elementeninizialisierer mit  int i(5);
> leider nicht bekannt...

Ist völlig analog zu
1
int main()
2
{
3
  Kammermusik myKammerObjekt( "Mozart", "Nachtmusik", "1687", "Dur", 4 );
4
5
  int         i             ( 5 );
6
}

Wenn du ein Kammermusik Objekt erzeugst, gibst du ja auch dem 
Konstruktor ein paar Werte zur Initialisierung mit. Da ist es doch nur 
recht und billig, dass man genau die gleiche Schreibweise auch zur 
Initialisierung von int oder double oder sonstigen Variablen benutzen 
kann:
1
  Datentyp  Name_der_Variablen   Initialiwert(e)_in_Klammern_eingeschlossen

Es gibt keinen Grund, warum man dieses Schema nicht auch auf int 
anwenden können sollte.
C++ hat natürlich auch von C die alte Schreibweise geerbt
1
   int i = 5;
aber das ist nur haarscharf genau dasselbe in einer anderen 
Schreibweise. Achtung: Das ist eine Initialisierung und keine Zuweisung. 
Selbst wenn da = steht!


>
> Das mit dem Zugriff in einer Klasse ist mir bekannt. Mir ist trotzdem
> noch nciht gnaz klar wuarm ich hier eine Inizialisierung mache.


Weil es Datentypen gibt, die du zwar initialisieren kannst, denen du 
aber nichts zuweisen kannst.

zb const Member
1
class Test
2
{
3
  public:
4
    Test( int val )
5
    : value( val )     // value kann initialisiert werden
6
    {
7
      value = val;     // Fehler: einer Konstanten kann man nichts zuweisen!
8
    }
9
10
  private:
11
    const int value;
12
}

Referenzen ist genau dasselbe. Worauf eine Referenz verweist, wird bei 
der Initialisierung festgelegt. Mittels Zuweisung ist das nicht mehr zu 
ändern.

>
> ist in meinem Beispiel
>
>>private: int nMusiker ;
>
> kein Initzialisierung?

Siehst du da irgendwo einen Initalwert?
Initialisierung heißt doch: Sobald etwas zur Welt kommt (die Variable) 
verpassen wir ihr noch während des Geburtsvorgangs ihren ersten Wert, 
den Initalwert.

Drum heißt es ja auch Initialisrung (und man schreibt Initialisierung 
und nicht Inizialisierung. T, nicht Z) und nicht Zuweisung. Jeder 
Versuch den Wert einer Variablen zu verändern, nachdem sie zur Welt 
gekommen ist, kann nur noch eine Zuweisung sein und keine 
Initialisierung.
C++ unterscheidet da ganz strikt.

von ./. (Gast)


Lesenswert?


von Chris (Gast)


Lesenswert?

dankeschön für die schnelle antwort... ich habs glaub ich verstanden...
liegt vielleicht auch dran, dass ich mit c vorbelastet bin.

gruß chris

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.