Methoden innerhalb einer Klasse
-
Hallo Leute,
da dieses Thema für mich ganz neu ist, kann ich folgende Methoden überhaupt nicht einordnen
void Multipliktaion (const ratio r);
void Muktiplikation (const ratio &r);also wie ich verstanden habe gehört eine von ihnen ehe zur public, die andere zu private, doch warum und was der Unterschied ist, kann ich nicht nachvollziehen..
wäre vielleicht einer so nett mir da ein bisschen Klarheit zu bringen?) Grus!
-
Das hat nichts mit public und private zu tun. Der Unterschied ist die Art wie 'r' an die Funktion uebergeben wird.
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.
Bei
void Muktiplikation (const ratio &r);wird eine Referenz auf 'r' uebergeben. Das heisst du arbeitest direkt auf dem uebergebenen Objekt - im Prinzip ist eine Referenz nur ein Name, mit dem du das Objekt ansprechen kannst. Wenn du 'r' aenderst (geht in diesem Fall nicht, da const) so aenderst du auch 'r' ausserhalb der Methode.
Google mal nach Call-by-Value und Call-by-Reference. Es ist extrem wichtig den Unterschied genau zu kennen.
-
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. Daher ist das auch eine etwas ungwöhnliche Schreibweise, denn es sieht für den Aufrufer auf den ersten Blick wie
const &raus, das const bezieht sich aber hier auf das r und ist somit ein unwichtiges Implementierungsdetails, dass des Aufrufer gar nicht zu interessieren braucht.Bei
void Muktiplikation (const ratio &r);wird eine Referenz auf 'r' uebergeben.
Hier wiederum bezieht sich das const auf das Objekt, auf das die Referenz r verweist (die Referenz an sich ist naturgemäß immer konstant). Dies ist für den Aufrufer wichtig, denn er weiß nun, dass sein übergebenes Objekt in der Funktion nicht verändert wird.
-
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...
-
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)