Funktionsparameter const und Referenzen



  • Hallo,

    ich arbeite mit wxWidgets, was aber mit meiner Frage nicht wirklich zu tun hat. Ich traue mich aber trotzdem meine Frage mit der wxWidgetsType wxString zu schreiben.

    Mit ist eine Sache bei Funktionsaufrufen nicht ganz klar.

    void eins(wxString& eins);
    void zwei(const wxString zwei);
    void drei(const int drei);
    

    Ich hab in mehreren Tutorials gelesen, dass ein Parameteraufruf mit const den Compiler anzeigt, dass die Variable nicht mehr verändert werden darf und folglich eine Referenz übergibt. Wären dann die Funktionen eins() und zwei() nicht identisch?

    Wenn diese nicht identisch sind, warum übergibt man dann bei Zahlen (int, short, etc) nie eine Referenz sondern macht die immer const? Da wird ja sonst auch eine Kopie angelegt.

    Ich habe Beispielsweise eine Klasse für einen MidiPlayer:

    class MyMidiPlayer
    {
    protected:
      unsigned short volume;
      wxString myname;
    public:
      MyMidiPlayer() { volume = 0, myname = _T("Some player"); };
      void SetVolume(const unsigned short newVolume) { volume = newVolume };
      void SetName(wxString& newName) { name = newName; };
      const wxString GetName() const { return myname; };
    };
    
    main()
      {
      MyMidiPlayer MyP();
      unsigned short newVol = 128;
      MyP.SetVolume(newVol);
      }
    

    Wenn ich jetzt SetVolume aufrufe, wird dann eine Kopie von newVol in der Funktion erst in newVolume und nach der Zuweisung in MyMidiPlayer::volume erzeugt, oder nicht.

    Bin sehr verwirrt, weil leider viele Tutorials irgendwie was anderes behaupten.

    Wäre meine Klasse für das Abfragen der Parameter so richtig?



  • Ich hoffe mal, ich habe deine Frage richtig verstanden.

    Nein, die Funktionen sind nicht identisch.

    Übergibst du einen String an Funktion eins, dann wird eine Referenz auf diesen String erstellt und übergeben.
    Änderungen innerhalb der Funktion an dem String werden demnach auch nach außen übernommen, d.h. wenn du innerhalb der Funktion ein "Test" an deinen String anhängst und die Funktion schließt, hat der übergebene String auch ein "Test" hinten dran hängen.

    Bei Funktion zwei wird eine Kopie des übergebenen Strings erstellt und in der lokalen Variable wxString gespeichert. An dieser lokalen Variable kannst du innerhalb der Funktion keine Änderung vornehmen.
    Wird die Funktion beendet, wird die Variable gelöscht. (Bei eins wird nur die Referenz gelöscht)

    Deine Klasse funktioniert. Sie funktioniert nach Prinzip 2, erstellt also eine lokale Kopie deines Shorts und weist diese der Variable "value" zu.

    (Mit Prinzip 1 würde sie allerdings auch funktionieren)

    Hoffe, ich konnte dir helfen.



  • Die erste Frage wurde ja bereits beantwortet.

    Zu dem hier:

    stefanjann schrieb:

    Wäre meine Klasse für das Abfragen der Parameter so richtig?

    Das sieht eigentlich so gut aus, allerdings kannst du den Konstruktor noch anpassen und die Initialisierungsliste benutzen:

    MyMidiPlayer() 
    : 
    volume ( 0 ),
    myname ( _T("Some player") )
    {};
    


  • Danke schön,

    dann mach ich mich mal daran, viele Praxiserfahrungen zu sammeln.

    Gruß,
    Stefan


Anmelden zum Antworten