auto a = "seven of"; // type of a is char const[] auto b = a; // b refers to same object as a a += " nine"; // ❌ COMPILER ERROR: can't be modified auto c = "al" + "cove"; // ❌ COMPILER ERROR std::string s = a; // a is copied into s s += " nine"; // ✔ (s is std::string)
“std::string Literal”s C++14
#include<string> usingnamespace std::string_literals; auto s1 = "seven of"s; // type of s1 is std::string auto s2 = s1; // s2 is a copy of s1 s1 += " nine"; // ✔ cout << s1 << '\n'; // seven of nine cout << s2 << '\n'; // seven of auto s3 = "uni"s + "matrix"s; // ✔ cout << s3 << '\n'; // unimatrix
Joining
String literals that are only separated by whitespace are joined:
"first" "second"` ⇒ `"first second"
std::string s = "This is one literal" "split into several" "source code lines!";
Raw String Literals
Advantage: special characters can be used without escaping
R"(raw "C"-string c:\users\joe)"
char const[]
C++11
R"(raw "std"-string c:\users\moe)"s
std::string
C++14
Syntax:R"DELIMITER(characters...)DELIMITER"
where DELIMITER can be a sequence of 0 to 16 characters except spaces, (, ) and \
String-Like Function Parameters
Use std::string_view for read-only parameters! C++17
lightweight (= cheap to copy, can be passed by value)
non-owning (= not responsible for allocating or deleting memory)
read-only view (= does not allow modification of target string)
of a string(-like) object (std::string/“literal”/…)
avoids expensive temporary strings when string literals are passed to functions
can speed up accesses by avoiding a level of indirection
If You…
Use Parameter Type
always need a copy of the input string inside the function
std::string “pass by value”
want read-only access, don’t (always) need a copy, are using C++17 / 20
#include std::string_view
want read-only access, don’t (always) need a copy, are stuck with C++98 / 11 / 14
std::string const& “pass by const reference”
want the function to modify the input string in-place (you should try to avoid such “output parameters”)
std::string & “pass by (non-const reference)”
std::getline
read entire lines / chunks of text at once
target string can be re-used (saving memory)
std::string s; getline(std::cin, s); // read entire line getline(std::cin, s, '\t'); // read until next tab getline(std::cin, s, 'a'); // read until next 'a'