标准库提供的 string类型弥补了字符串字面常量的不足。 string类型提供了很多有用的字符串操作,最典型的比如连接操作。下面是一个例子:

    1. string compose(const string& name,const string& domain)
    2. {
    3. return name+'@'+ domain;
    4. }
    5. auto addr compose("dmr","bell-labs.com");

    在本例中,addr被初始化为字符序列dmr@bel-abs.com。函数compose中的字符串加法”表示连接操作。你可以将一个 string对象、一个字符串字面常量、一个C-风格字符串或是一个字符连接到 string上。标准库 string定义了一个移动构造函数,因此,即使是以传值方式而不是传引用方式返回一个很长的 string也会很高效(见3.32节)。
    在很多应用中,连接操作最常见的用法是在一个 string的末尾添加一些内容。这可以直接通过+=操作来实现。例如:

    1. void m2(string& s1,string& s2)
    2. {
    3. s1=s1+'\n'; //追加换行
    4. s2+='n'; //追加换行
    5. }

    这两种向 string末尾添加内容的方法在语义上是等价的,但我更倾向于使用后者,因为它更明确、更简洁地表达了要做什么,而且可能也更高效。
    string对象是可变的。除了=和+=外, string还支持下标操作(使用[])和子串操作。第36章将介绍标准库 string的详细信息。它为其他有用的特性提供了操纵子串的能力。
    例如:

    1. string name ="Niels Stroustrup";
    2. void m3()
    3. {
    4. string s= name.substr(6, 10); //s="Stroustrup"
    5. name.replace(0,5,"nicholas"); //name变为"nicholas Stroustrup"
    6. name[0]= toupper(name[0]); //name变为"Nicholas Stroustrup"
    7. }

    substr()操作返回一个 string,保存实参指定的子串的拷贝。第一个参数是一个下标,指向stng中的一个位置,第二个参数指出所需子串的长度。由于下标从0开始,因此上面的程序中s得到的值是 Stroustrup。
    replace()操作替换子串内容。在本例中,要替换的是从0开始长度为5的子串,即Nies,它被替换为nicholas。最后,我将首字母变为大写。因此,name的最终值为Nicholas Stroustrup。注意,替换的内容和被替换的子串不必一样长。
    自然地, string之间可以相互比较,也可以与字符串字面常量比较,例如:

    1. void respond(const string& answer)
    2. {
    3. if(answer == incantation)
    4. {
    5. //执行一些操作
    6. }else if(answer == "yes")
    7. {
    8. //执行一些操作
    9. }
    10. }

    第36章将介绍标准库 string的详细信息,实现 string用到的关键技术在 String例子中有所体现(见19.3节)。