www.mikrocontroller.net

Forum: PC-Programmierung C++ Constructor


Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

class Kammermusik : public Musikstueck
{
private: int nMusiker ;
public : Kammermusik ( char * szWer , char * szWas ,char * szWann , char * szDurMoll ,int nAnz )
: Musikstueck (szWer , szWas , szWann , szDurMoll ),nMusiker ( nAnz )//hier
{};
virtual void Ausgabe ()
{
Musikstueck :: Ausgabe ();
cout <<"\ nAnzahl Musiker : " << nMusiker <<"\n";
};
};

Autor: Marcel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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
int main()
{
  Kammermusik myKammerObjekt( "Mozart", "Nachtmusik", "1687", "Dur", 4 );

  int         i             ( 5 );
}

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:
  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
   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
class Test
{
  public:
    Test( int val )
    : value( val )     // value kann initialisiert werden
    {
      value = val;     // Fehler: einer Konstanten kann man nichts zuweisen!
    }

  private:
    const int value;
}

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.

Autor: ./. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.