Methoden innerhalb einer Klasse



  • Hier vielleicht ein einfaches Beispiel, das den Unterschied zeigen soll. Es sind zwei Implementierungen einer Swap-Funktion fuer ints. Die eine davon funktioniert allerdings nicht.

    #include <iostream>
    
    using std::cout;
    using std::cin;
    using std::endl;
    
    // Bei dieser Funktion werden Kopien uebergeben.
    // Wenn a und b innerhalb der Funktion veraendert werden,
    // so hast das keinen globalen Effekt.
    void swap_wrong( int a, int b )
    {
    	int temp = a;
    	a = b;
    	b = temp;
    }
    
    // Bei dieser Funkton werden Referenzen uebergeben.
    // Wenn a und b innerhalb der Funkiton veraendert werden,
    // so hat das einen globalen Effekt.
    void swap_correct( int& a, int& b )
    {
    	int temp = a;
    	a = b;
    	b = temp;
    }
    
    int main()
    {
    	int x = 1;
    	int y = 2;
    	swap_wrong( x, y ); // x und y bleiben gleich, da nur Kopien uebergeben werden
    	cout << "x = " << x << endl;
    	cout << "y = " << y << endl;
    
    	int u = 1;
    	int v = 2;
    	swap_correct( u, v ); // u und v werden "echt" uebergeben, ohne dass eine Kopie angelegt wird. Deswegen veraendern sich u und v auch in der main-Methode
    	cout << "u = " << u << endl;
    	cout << "v = " << v << endl;
    }
    


  • alles klar Leute, vielen vielen Dank für Ihre Hilfe, werde dann wohl die Beiträge noch mal alle durchgehen und versuchen mir ein klares Bild zu machen! vielen Dank noch mal))



  • SeppJ schrieb:

    icarus2 schrieb:

    Bei

    void Multipliktaion (const ratio r);
    

    wird eine Kopie von r uebergeben. Das heisst wenn du 'r' innerhalb der Methode veraenderst, so veraenderst du nur eine lokale Kopie.

    Was man hier übrigens nicht kann, wegen des const.

    Das const wird hier ignoriert (C++98, 8.3.5p3).



  • Bashar schrieb:

    SeppJ schrieb:

    icarus2 schrieb:

    Bei

    void Multipliktaion (const ratio r);
    

    wird eine Kopie von r uebergeben. Das heisst wenn du 'r' innerhalb der Methode veraenderst, so veraenderst du nur eine lokale Kopie.

    Was man hier übrigens nicht kann, wegen des const.

    Das const wird hier ignoriert (C++98, 8.3.5p3).

    Danke fuer den Hinweis, das wusste ich nicht.
    Weisst du wieso die sich dafuer entschieden haben? Das ist aus meiner Sicht etwas merkwuerdig.



  • Nein, weiß ich nicht. Aber ich vermute, es ist genau das, was SeppJ sagt, dass es sich um ein für den Aufrufer völlig uninteressantes Implementationsdetail handelt.



  • Hallo, die beiden Funktionen wurden uns vom Prof fürs nächste Praktikum vorgegeben. Sie sollen public methoden einer Klasse sein. Da gibt es noch mehr Funktionen, die alle einen & Zeichen besitzen und nur die Multiplikation ohne das Adresszeichen & da ist.. ich spiele mittlerweiler mit Gedanken es könnte sich von einem Tippfehler handeln...


  • Mod

    Bashar schrieb:

    SeppJ schrieb:

    icarus2 schrieb:

    Bei

    void Multipliktaion (const ratio r);
    

    wird eine Kopie von r uebergeben. Das heisst wenn du 'r' innerhalb der Methode veraenderst, so veraenderst du nur eine lokale Kopie.

    Was man hier übrigens nicht kann, wegen des const.

    Das const wird hier ignoriert (C++98, 8.3.5p3).

    Es wird hinsichtlich der Signatur ignoriert, im Funktionskörper kann man den Parameter aber trotzdem nicht ändern.

    void foo(const int a)
    {
      ++a; // Compilerfehler
    }
    
    void (*bar)(int) = foo; // ok
    


  • SeppJ schrieb:

    Bashar schrieb:

    Das const wird hier ignoriert (C++98, 8.3.5p3).

    Es wird hinsichtlich der Signatur ignoriert, im Funktionskörper kann man den Parameter aber trotzdem nicht ändern.

    Deswegen schrub ich "hier", im Beispiel war es ja eine Deklaration.



  • schrub 😃 😃



  • Sirius7 schrieb:

    Hallo, die beiden Funktionen wurden uns vom Prof fürs nächste Praktikum vorgegeben. Sie sollen public methoden einer Klasse sein. Da gibt es noch mehr Funktionen, die alle einen & Zeichen besitzen und nur die Multiplikation ohne das Adresszeichen & da ist.. ich spiele mittlerweiler mit Gedanken es könnte sich von einem Tippfehler handeln...

    Nach allem, was ich hier im Forum bisher über Übungsaufgaben gelesen habe befürchte ich, dass der Code so aussieht 😉

    #include <stdio.h>
    
    int mul( int* a, int* b )
    {
       return *a * *b;
    }
    
    void main()
    {
       int a = 7;
       int b = 3;
    
       int c = mul( &a, &b );
    
       prinf( "Das Ergebnis von %d * %d ist %d", a, b, c );
    }
    


  • Sirius7 schrieb:

    Da gibt es noch mehr Funktionen, die alle einen & Zeichen besitzen und nur die Multiplikation ohne das Adresszeichen & da ist..

    Das ist kein Adresszeichen. Schau dir im Lehrbuch deiner Wahl mal das Thema Referenzen an, dort wirst du feststellen, dass es einen großen Unterschied macht, wo das & steht:
    - als unäres & vor einem Ausdruck (adressof-Operator)
    - als binäres & zwischen zwei Ausdrücken (binärer AND-Operator)
    - als Teil einer Typbezeichnung (Referenz)


Anmelden zum Antworten