Referenz auf String Objekt
-
Entschuldigt für die vielleicht blöde Frage...
Aber macht eine Referenz auf ein String Objekt Sinn?
Danke für die Antworten im Voraus.
Gruß
Max
-
ja. nämlich den gleichen wie referenzen auf alle anderen objekte. (z.B. call-by-reference)
-
Wie so oft:
Es kommt drauf an ...Als Parameter für eine Funktion macht es in aller Regel Sinn, eine Referenz auf ein String-Objekt statt des String-Objektes selbst zu übergeben:
void funk(std::string ¶m);
oder bei Bedarf:
void funk(const std::string ¶m);
denn ohne Referenz wird bei jedem Aufruf der ganze String kopiert. Das kann je nach Größe des Strings und Anzahl der Funktionsaufrufe einen Performanceunterschied ausmachen.
-
oder manche dinge (wie streams) können gar nicht kopiert werden, es macht aber sinn diese an funktion zu geben (wie print oder ausgabe funktionen)
aber ich glaube eher deine frage richtet sich an pure referenzen innerhalb von funktionen wie das hier:
int main() { std::string a("Hallo"); std::string & ref = a; ref += " Welt"; std::cout << a==ref << std::endl; std::cout << a << std::endl << ref << std::endl; return 0x0; }da braucht man eigentlich nie referenzen. meienr erfahrung nach, sind die echt nur für call-by-reference aufrufe
-
void funk(std::string ¶m);
oder bei Bedarf:
void funk(const std::string ¶m);
Nein. Genau anders herum:
void funk(std::string const& param); // oder bei Bedarf: void funk(std::string& param);
-
Gott, bist Du blöd ...
Du wirst nie mehr aufhören, oder?
-
Belli schrieb:
Gott, bist Du blöd ...
Du wirst nie mehr aufhören, oder?da muss Sone aber zustimmen. Ich hätte das auch angemerkt, wenn er es nicht schon geschrieben hätte.
const-correctness ist ein sehr wichtiges Konzept.
-
Belli schrieb:
Gott, bist Du blöd ...
Jetzt hört doch bitte mal auf, euch gegenseitig so nieder zu machen

Jetzt mal zurück zum Thema Referenz auf String...
Ich weiß, dass folgender Quellcode wahrscheinlich ein Scheißdreck ist, aber dennoch hätte ich diesbezüglich Fragen:
#include <iostream> #include <string> using namespace std; string Text(string Text) //Funktionsdefinition { string Text; //Text als Stringvariable anlegen cout << "Geben Sie einen Text ein\n"; //Ausgabe getline(cin, Text); //Texteingabe return Text; //Stringvariable Text zurückgeben } int main() { string &Text =Text(Text); //Referenz auf die Funktion cout << &Text << "\n"; //Ausgabe der Referenz return 0; }Ich bekomme als Fehlermeldung folgendes:
error C2082: Neudefinition des formalen Parameters "Text" (bezieht sich auf Zeile 11) error C2064: Ausdruck ergibt keine Funktion, die 1 Argumente übernimmt (bezieht sich auf Zeile 20)Funktioniert es überhaupt, wie ich mir das dachte??
-
Belli schrieb:
Gott, bist Du blöd ...
Du wirst nie mehr aufhören, oder?Belli, ich habe keine Ahnung was du hast, aber anscheinend hast du selbst nicht verstanden wovon du redest wenn du standardmäßig lvalue-Referenzen für Strings nimmst. :xmas1:
Funktioniert es überhaupt, wie ich mir das dachte??
*facepalm*
Du kannst nicht zwei Variablen im selben Scope mit selbem Identifier definieren (ODR).
Das müsstest du jetzt aber schon wissen, oder?string &Text =Text(Text); //Referenz auf die FunktionDazu sage ich nur: WTF?
Es muss so aussehen:std::string (&Text) (std::string) = ::Text;(Ungetestet)
-
nein.
bei mir im visual studio (2012) meint der, dass du 2 mal den gleichen variablennamen verwendest... (zeile 7 -> logisch oder?!)
das ersetze ich mal bzw kommentiere die zeile aus.und jetzt meint der compiler noch, dass der "ausdruck" in zeile 16 keine funktion mit einem argument ergibt -> ok, ich benenne die funktion mal um
jetzt läuft es.
ABER: es kracht wenn du es ausführst... über das warum kannst du mal drüber nachdenken

#include <iostream> #include <string> using namespace std; string func(string Text) //Funktionsdefinition { //string Text; //Text als Stringvariable anlegen cout << "Geben Sie einen Text ein\n"; //Ausgabe getline(cin, Text); //Texteingabe return Text; //Stringvariable Text zurückgeben } int main() { string &Text = func(Text); //Referenz auf die Funktion cout << &Text << "\n"; //Ausgabe der Referenz return 0; }
-
silent_max schrieb:
Funktioniert es überhaupt, wie ich mir das dachte??
nein. Auch wenn ich nicht weiß, was du dir dabei dachtest...
* Du übergibst der Funktion "Text" einen unbekannten Parameter.
* Dann darfst du eine Variable nicht wie eine Funktion benennen. Überhaupt soltlest du dir Gedanken über eine sinnvolle Namensgebung machen und nicht einfach alles "Text" nennen. Da ist die Verwirrung komplett, mit welchem "Text" du gerade arbeitest.
* In der Funktion "Text" wird der Parameter "Text" völlig ignoriert.
* "string &Text =Text(Text); //Referenz auf die Funktion" ist keine Referenz auf eine Funktion, sondern eine Referenz auf den Rückgabewert dieser Funktion.
-
okay, was sone da sagt kann auch hand und fuss haben.
möchtest du eine referenz auf das ergebnis der funktion oder willst du einen funktionszeiger?
-
Ja entschuldigt, ich bin noch nicht ganz wach.
Hier mal der richtige Code:
#include <iostream> #include <string> using namespace std; string Text(string Eingabe) { cout << "Geben Sie einen Text ein\n"; getline(cin, Eingabe); return Eingabe; } int main() { string Eingabe; string &Text_1 =Text(Eingabe); cout << Text_1 << "\n"; return 0; }
-
Skym0sh0 schrieb:
okay, was sone da sagt kann auch hand und fuss haben.
möchtest du eine referenz auf das ergebnis der funktion oder willst du einen funktionszeiger?
Das Problem ist, dass er sich z. T. mit den Begrifflichkeiten verfusselt.
"Referenz auf Funktion" ist für mich ziemlich eindeutig eine Referenz auf eine Funktion, aber ich denke, er meint eine Referenz auf den Rückgabewert?!
Schwer zu erkennen, wenn sein Code totaler Müll ist...
-
string &Text_1 =Text(Eingabe);
Du kannst keine lvalue-Referenz auf ein prvalue haben.
Mach daraus einfach ein eigenes string-Objekt.
Über die Performance brauchst du dir keine Gedanken machen, RVO macht den Rest.
-
ich finds eh schwachsinn sich so früh gedanken über irgendwelche performance zu machen. wenn man halbwegs seinen kopf zusammenhält und nicht total ineffizienten kram schreibt passt das alles.
und wenn kurz vorm release alles zu langsam ist, setzt man einen profiler drauf an und optimiert danach.
alles andere ist in meinen augen premature optimizing, denn gerade sowas sollte der compiler durch RValue Referenzen und RVO locker in den griff kriegen, wenn nicht hilft man ihm halt und gut ist
-
Wo besteht eigentlich der Unterschied zwischen
call-by-referenceundcall-by-value??
-
-
silent_max schrieb:
Wo besteht eigentlich der Unterschied zwischen
call-by-referenceundcall-by-value??
-
Ich denke, du willst sowas:
#include <iostream> #include <string> using namespace std; // Für kleine Übungsprogramme völlig in Ordnung. Sogar gut, denn es verkürzt den Code und macht ihn leichter lesbar - alles, was man eigentlich braucht void Text(string& Eingabe) // Es wird direkt nach 'Eingabe' extrahiert. Das macht den Code in der main() und in Text() kürzer und hat auch sonst keine Nachteile. // Ich habe mich sowieso schon gefragt: Was sollte das mit dem Parameter Eingabe? Variablen, die die Funktion nur für die interne // Funktionsweise braucht, werden auch intern definiert, nicht als Parameter. { cout << "Geben Sie einen Text ein:\n"; getline(cin, Eingabe); // Die Fehlerprüfung unterlassen wir mal zugunsten der Einfachheit } int main() { string Eingabe; Text(Eingabe); cout << Eingabe << "\n"; } // Das return-Statement kann in der main() weggelassen werden