Referenz auf String Objekt



  • 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-reference und call-by-value ??





  • silent_max schrieb:

    Wo besteht eigentlich der Unterschied zwischen call-by-reference und call-by-value ??

    http://bit.ly/ZeU1cf



  • 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
    


  • Sone schrieb:

    Ich denke, du willst sowas:

    oder sowas:

    #include <iostream>
    #include <string>
    
    std::string ReadText() 
    {
        cout << "Geben Sie einen Text ein:\n";
        std::string input;
        getline(cin, input); 
    
        return input;
    }
    
    int main()
    {
        string Eingabe = ReadText();
        cout << Eingabe << "\n";
    }
    


  • Skym0sh0 schrieb:

    keine 5 sekunden google...

    `

    call-by-value

    Bei CBV werden die an eine Funktion übergebenen Daten kopiert. Es besteht dann keine Verbindung mehr zwischen den Daten beim Aufrufer und den Daten in der Funktion. Werden große Objekte auf diese Weise übergeben, so ist das sehr kostspielig in Bezug auf Rechenzeit (der Kopiervorgang) und Speicherplatz (Daten sind mehrmals vorhanden).

    call-by-reference

    Anstatt die Daten zu kopieren werden Referenzen auf die Daten übergeben. Man kann sich das als Zeiger vorstellen: Beim Aufrufer zeigt eine Variable auf ein bestimmtes Datum, in der Funktion zeigt eine andere Variable auf dasselbe Datum. Methodenaufrufe an einem so übergebenen Objekt arbeiten also auf demselben Objekt, das auch außerhalb sichtbar ist.`

    Habe ich das richtig verstanden, dass bei CBR, also call-by-reference,
    -> die Performance besser ist?
    -> der Zugriff auf Daten bzw. einfacher ist?



  • silent_max schrieb:

    Habe ich das richtig verstanden, dass bei CBR, also call-by-reference,
    -> die Performance besser ist?

    Ja

    silent_max schrieb:

    -> der Zugriff auf Daten bzw. einfacher ist?

    Nein. Der Unterschied besteht darin, dass bei CBR das Objekt *nicht* kopiert wird. Änderungen an dem Objekt haben also Auswirkungen "nach außen". Deswegen sollten Objekte bei CBR möglichst "const" übergeben werden.



  • http://www.cplusplus.com/forum/general/7990/

    So wie ich das jetzt verstanden habe, wird bei call-by-reference mit Pointern gearbeitet??



  • silent_max schrieb:

    http://www.cplusplus.com/forum/general/7990/

    So wie ich das jetzt verstanden habe, wird bei call-by-reference mit Pointern gearbeitet??

    Nein.
    Eine Referenz ist intern ein konstanter Pointer- daher wird bei CBR nur der Pointer statt dem Pointee kopiert.

    Mit Pointern hat das aber beim programmieren nichts zu tun.



  • Wie macht ihr es eigentlich, dass ihr so viel Ahnung vom Programmieren in C++ habt??



  • silent_max schrieb:

    Wie macht ihr es eigentlich, dass ihr so viel Ahnung vom Programmieren in C++ habt??

    * Bücher lesen & verstehen
    * Jahrelange Erfahrung



  • daddy_felix schrieb:

    silent_max schrieb:

    Wie macht ihr es eigentlich, dass ihr so viel Ahnung vom Programmieren in C++ habt??

    * Bücher lesen & verstehen
    * Jahrelange Erfahrung

    + Forum 🙂



  • daddy_felix schrieb:

    * Bücher lesen & verstehen
    * Jahrelange Erfahrung

    das mit der erfahrung glaube ich nicht. sone ist doch noch en junger spund, der kA vielleicht grad die oberstufe besucht...

    aber ich kann dem zustimmen. und wenn man hier im forum einfach nur lauscht kriegt man viel mit.

    und mit programmiersprachen ists wie mit normalen sprachen: mit der zeit nutzt man sie anders, es werden dialekte entwickelt und best practices und so weiter

    das kommt alles mit der zeit. ich hätte früher auch fast für jedes bisschen gefragt wie du. aber man kann das fast alles auch mit probieren rauskriegen (oder google)



  • Seid ihr hauptberuflich C++ Programmierer??

    Trotzdem hätte ich noch eine Frage.

    Ich wollte einen konstanten Text per Referenz ausgeben.

    Dazu folgender Code:

    #include<iostream>
    #include<string>
    using namespace std;
    
    string Text(string const Eingabe)//Definition der Funktion Text mit konstanem String
    {
    	Eingabe == "Dies ist ein konstanter Text!\n"; //Den Text per Eingabe definieren
    	return Eingabe; //Rückgabe von Eingabe
    }
    
    int main()
    {
    	string Eingabe; //Definition der Stringvariablen Eingabe
    	string &Text_1=Text(Eingabe); //Initialisierung der Referenzvariablen Text_1 mit Text(Eingabe)
    	cout << Text_1 << "\n"; //Ausgabe des konstanten Textes
    
    	return 0;
    }
    

    In der Ausgabe erscheint aber gar nichts.

    Was habe ich falsch gemacht?



  • silent_max schrieb:

    Seid ihr hauptberuflich C++ Programmierer??

    Ich bin Softwareentwickler und arbeite derzeit hauptsächlich mit C++ und ein wenig mit Erlang

    silent_max schrieb:

    Was habe ich falsch gemacht?

    Du hast den Debugger nicht verwendet. Dann hättest du gesehen, dass die Zuweisung "Eingabe == "Dies ist ein konstanter Text!\n";" offensichtlich nciht das macht, was du erwartest...

    Wenn du den Fehler korrigiert hast, wird der Compiler meckern, dass er einem konstanten Objekt ncihts zuweisen kann.

    Warum übrgibst du überhaupt den String als Referenz und gibst ihn als Rückgabewert dann wieder zurück?



  • So... Jetzt funktioniert es, habe gerade auch den Debugger benutzt:

    #include<iostream>
    #include<string>
    using namespace std;
    
    string Text(string )//Definition der Funktion Text mit konstanem String
    {
    	string const Eingabe = "Dies ist ein konstanter Text!\n"; //Den Text per Eingabe definieren
    	return Eingabe; //Rückgabe von Eingabe
    }
    
    int main()
    {
    	string Eingabe; //Definition der Stringvariablen Eingabe
    	string &Text_1=Text(Eingabe); //Initialisierung der Referenzvariablen Text_1 mit Text(Eingabe)
    	cout << Text_1 << "\n"; //Ausgabe des konstanten Textes
    
    	return 0;
    }
    

    Kommen eigentlich in der Praxis Referenzen auf Strings häufig vor??



  • So... Jetzt funktioniert es, habe gerade auch den Debugger benutzt:

    Aber wohl nicht dein Hirn.

    Kommen eigentlich in der Praxis Referenzen auf Strings häufig vor??

    Du stellst Fragen...
    Es kommt einfach da vor, wo es vorkommt.

    #include<iostream>
    #include<string>
    using namespace std;
     
    string Text(string )//Definition der Funktion Text mit konstanem String
    {
        string const Eingabe = "Dies ist ein konstanter Text!\n"; //Den Text per Eingabe definieren
        return Eingabe; //Rückgabe von Eingabe
    }
     
    int main()
    {
        string Eingabe; //Definition der Stringvariablen Eingabe
        string &Text_1=Text(Eingabe); //Initialisierung der Referenzvariablen Text_1 mit Text(Eingabe)
        cout << Text_1 << "\n"; //Ausgabe des konstanten Textes
    }
    

    ???

    • Wieso hat Text() einen Parameter, den du gar nicht verwendest?
    • Wieso hast du schon wieder eine Referenz auf den Rückgabewert der Funktion Text?
      wtf?

Anmelden zum Antworten