字符串的 "+" 重载

字面值字符串,即常量字符串,可以对string实例使用 重载的 + 运算,但是不能对两个字面值字符串相加,可以
使用字面值先分别初始化成string实例,然后再相加

        注:这很好理解,由于c++是对c的包装,所以从底层的东西没有改变,字面值字符串依旧是存在于
            正文区(.text)

   有如下:
        string a = "hello" + "world";  //错误
        string a = "hello" + string("world");  //正确
        string a = "hello" + "world" + string("!");     //错误
        string a = string("hello") + "world" + "!";     //正确,因为运算是从左往右的,hello world会先形成新的string实例
        string a = "hello" + string(" ") + "world";     //正确

   小结:使用时,编译状态会检测错误,但是还是需要知道,+ 如果想表现为字符串拼接,那么就必须要求运算符两侧
         至少有一侧是 string实例,而不是字面值字符串。

   PS : 其实这是为了与c兼容,c++编译器不会吧字符串常量自动转换成string实例

 

foreach遍历并修改string

可以使用引用作为foreach的变量,进而达到改变字符串中指定字符的目的

for(auto &a:str){
if(a == 'c'){
a = 'C';
}
}

 

string的 [] 重载

string 支持 [] 的重载动作,让string可以像数组一样按索引位置访问。

[]的引入,让string既具备了c++的字符串属性,也具备了c的字符数组属性,因此我们在对待string类型的时候,
需要同时以两种思维思考问题,这样便于找到最优解 ( 字符串的批量处理 / 字符数组的指定位置处理 )

 

c_str()方法使用注意

string的c_str()函数返回一个char指针,这个指针指向string的值,可以用c里面的char数组/指针来获取string的值。
但是,需要注意,这里是指针:1)也就意味着如果string实例被销毁,则这个指针变为野指针;
                                                   2)如果string的值改变,那么这个指针指向的内容也会被改变。
所以,在混合使用string、char *、char []的时候,如果想要string的值,请自行分配内存,做memcpy备份,否则,将存在dump的风险。

如果使用c_str()来给string进行赋值(拷贝)初始化则不用关心内存问题,因为string的赋值构造函数会自行拷贝备份,而不是使用指针。