C++ Constructor

Gast #2034096
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
};
Gast #2034116
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.
#2034121
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.
Gast #2034908
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
#2035066
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren