Unterschied string <-> Stringliteral?



  • Hallo,

    ich stecke gerade in einer Passage eines C++-Einsteigerbuches fest, in der es um das Konzept der Verkettung geht. So heißt es, dass ein string und ein Stringliteral oder zwei strings, aber nicht zwei Stringliterale miteinander verkettet werden können.

    Mein Verständnisproblem: Wo liegt der Unterschied zwischen einem string und einem Stringliteral?

    Konkretes Beispiel:

    const std::string ahoi = "Ahoi";
    const std::string gruss = ahoi + ", Matrose" + "!";

    ... funktioniert. Im Gegensatz zu:

    const std::string ausruf = "!";
    const std::string gruss = "Ahoi" + ", Matrose" + ausruf;

    Ich sehe auf Anhieb jetzt keinen elementaren Unterschied zwischen den beiden Beispielen.

    Vielen Dank für Eure Hilfe!

    K.



  • Ein Stringliteral steht in Anführungszeichen im Code und ist vom Typ const char[N] , wobei N die Grösse des Arrays inklusive Nullterminierung angibt:

    "Hallo!"
    

    Ein String hingegen ist eine Instanz der Klasse std::string :

    std::string("Hallo")
    

    Nun ist der operator+ für die String-Klasse überladen, sodass auf einfache Weise mehrere Strings aneinandergehängt werden können. Für die Stringliterale ( const char -Arrays) geht das nicht. Mindestens ein Operand muss ein selbstdefinierter Typ sein, also hier die String-Klasse.



  • kuckuck schrieb:

    Hallo,

    ich stecke gerade in einer Passage eines C++-Einsteigerbuches fest, in der es um das Konzept der Verkettung geht. So heißt es, dass ein string und ein Stringliteral oder zwei strings, aber nicht zwei Stringliterale miteinander verkettet werden können.

    Mein Verständnisproblem: Wo liegt der Unterschied zwischen einem string und einem Stringliteral?

    Konkretes Beispiel:

    const std::string ahoi = "Ahoi";
    const std::string gruss = ahoi + ", Matrose" + "!";

    ... funktioniert. Im Gegensatz zu:

    const std::string ausruf = "!";
    const std::string gruss = "Ahoi" + ", Matrose" + ausruf;

    Ich sehe auf Anhieb jetzt keinen elementaren Unterschied zwischen den beiden Beispielen.

    Vielen Dank für Eure Hilfe!

    K.

    Und das geht in deinem ersten beispiel weil der string am anfang steht. Daruch wird string + literal + literal zu ((string + literal) + literal) und string + literal ist wieder ein string.



  • d.h., das Ganze ist nicht kommutativ, es gilt also string+literal = string, jedoch literal+string != string, ja?

    Vielen Dank soweit für die prompte Beantwortung meiner Frage!



  • kuckuck schrieb:

    d.h., das Ganze ist nicht kommutativ, es gilt also string+literal = string, jedoch literal+string != string, ja?

    Doch, beide Varianten geben einen std::string zurück. Natürlich sind sie nicht kommutativ, weil an anderen Enden angefügt wird.

    std::string String = "String";
    const char[] Array = "Literal";
    
    String + String; // ok
    String + Array;  // ok
    Array + String;  // ok
    Array + Array;   // nicht ok, da kein Operand ein selbstdefinierter Typ ist.
    

Anmelden zum Antworten