Referenz
-
Hallo, hab da noch n kleines Verständnisproblem irgendwie grad:
#include <iostream> using namespace std; void func(int &a); int main() { int value=14; func(value); func(12); //Was muss ich machen, dass das hier auch geht?! return 0; } void func(int &a) { cout << a << endl; }ERRORS:
Compiling: C:\MinGW\Andi\referenz.cpp
C:\MinGW\Andi\referenz.cpp: In functionint main()': C:\\MinGW\\Andi\\referenz.cpp:10: error: call of overloadedfunc(int&)' is ambiguous
C:\MinGW\Andi\referenz.cpp:4: note: candidates are: void func(int&)
C:\MinGW\Andi\referenz.cpp:5: note: void func(int)
Process terminated with status 1 (0 minutes, 0 seconds)
3 errors, 0 warningsMfG
Stromberg
-
void func(int &a); --> void func(const int &a);Da du die per Referenz übergebene Variable verändern könntest, was aber bei der konstante 12 nicht möglich ist.
Allerdibgs machen Referenzen bei built-in Typen nur Sinn, wenn du sie verändern willst. Einen Geschwindigkeitsvorteil gibt es dabei wohl eher nicht.
-
Hallo
Also bei mir kommt da der wesentlich aussagekräftigere Fehler
...main.cpp:10: error: invalid initialization of non-const reference of type 'int&' from a temporary of type 'int'
...main.cpp:4: error: in passing argument 1 of `void func(int&)'und besagt das deine Funktion eine Referenz auf ein int erwartet, aber du im zweiten Aufruf einen statischen Wert übergeben willst. Entweder bleibst du bei der Referenz als Funktionsparameter und arbeitest mit Referenzfähigen Variablen (wie beim ersten Aufruf), entfernst die Referenz und arbeitest mit einem By-Value Parameter oder du nimmst eine konstante Referenz.
(Bei einer nichtkonstanten Referenz erwartet der Compiler deb übergebenen Wert zur Laufzeit verändern zu können. Was aber bei deiner statischen 12 nicht geht)
bis bald
akari
-
verständniss problem aus deiner seite, wenn die fkt. eine rferenz erwarten spich einen pointer dann musss du ih auch nen pointer/zeiger übergeben wie hier :
#include <iostream> using namespace std; void func(int &a); int main() { int value=14; int *pointer=&value; func(*pointer); //func(12); //Was muss ich machen, dass das hier auch geht?! return 0; } void func(int &a) { cout << a << endl; }... aber wie könnte man das verstehen : :p
Allerdibgs machen Referenzen bei built-in Typen nur Sinn, wenn du sie verändern willst. Einen Geschwindigkeitsvorteil gibt es dabei wohl eher nicht.
-
Eine Referenz ist etwas anderes als ein Pointer...
Und das was du da machst, ist unnötig Oo
Da kann er gleich value übergeben, so wie er es gemacht hat.
-
nö, referenz übergabe heist speicheradresse übergabe (cal by recerence) und daneben gibt es das übliche Call by Value, also mittels ner normalen variablen. da bin ich mir ziemlich sicher

-
trotzdem... warum so umständlich mit dem pointer-gewirr?
-
Noch nä Frage, ich verstehe noch nicht ganz, eigentlich sollte man doch am besten immer Referenzen als Parameter verwenden. Weil ich habe gelernt, ohne Referenz wird eine Kopie der Variable erstellt und dass kostet Zeit. Mit Referenz wird direkt auf die Variable zugegriffen, keine Kopie somit kein Zeitverlust.
Oder sollte ich eine Referenz nur nutzen wenn ich eine Variable außerhalb der Funktion verändern möchte weil sonst würde ja wieder eine unötige Kopie entstehen) aber wenn ja, warum?Referenz:
int a=12; func(a); void func(int &a) { a=2*a; }Call by value: (mh is vll. n eher schlechtes Beispiel, mir fällt grad nix anderes ein)
int a=12; a=func(a); int func(int a) //Kopie 1 { return a*2; //Kopie 2 }MfG
Stromberg
-
ich meine wenn oben &varaible verwendet wird muss auch ne referenz übergeben werden... udn das mittels zeiger. oder nicht

-
rumcajs007 schrieb:
ich meine wenn oben &varaible verwendet wird muss auch ne referenz übergeben werden... udn das mittels zeiger. oder nicht

Kann es sein, das du von C kommst? Wir sprechen hier von C++.
Referenzen haben nichts mit Pointer zutun! Wie bereits von jemand anderem gesagt.
-
Nein, eine Referenz muß kein Zeiger sein, sondern kann auch ein Objekt sein, nur darf dieses eben nicht konstant sein (wie z.B. von akari schon angemerkt wurde).
Und bei den eingebauten Datentypen sollte man keine konstanten Referenzen benutzen, sondern eine einfache Wertübergabe, da diese Datentypen höchstens so groß wie ein Zeiger sind (welcher intern bei Referenzen verwendet wird).
Also:void func(int x, const Class &cl); // nicht: void func(const int &x, Class cl); // cl würde eine Kopie darstellenNur wenn wirklich eine echte (nicht-konstante) Referenz benötigt wird, sollte man diese übergeben, ansonsten 'const-correctness' beachten.
-
eigentlich nicht, ich komme aus F dh. Frankfurt, dürfte ich mal erfahren was daran nicht stimmt :p
...okreferenz heisst doch speicheradresse von was auch immer, variable, stuktur oder objekt, oder nicht

-
rumcajs007 schrieb:
referenz heisst doch speicheradresse von was auch immer, variable, stuktur oder objekt, oder nicht

Nein, ebend nicht! Oder du kommst von Java? Wir sind hier in der C++-Welt!
Referenzen in C++ heißt: "Eine Referenz ist ein anderer Name für eine Variable." Nicht mehr und nicht weniger.
http://www.kharchi.eu/wiki/doku.php?id=cpp:std:reference
-
ah soo, danke für'n link
