标签:
我们都知道可以用已下方式来初始化string对象:
string s(“hello world!”);
实际上我们也可以通过这样的方式来实现:
char c[] = {‘h’,‘e’,‘l’,‘l’,‘o’,‘ ‘,‘w’,‘o’,‘r’,‘l’,‘d’,‘!’,‘\0’};
string s = c;
但是如果数组c不是以空字符结尾的话,那么上面的赋值就是不正确的。
实际上,任何出现字符串字面值(即上面的“hello world!”这种形式)的地方都可以用以空字符结束的字符数组来替代。注意点如下:
1、可以使用以空字符结尾的字符数组来初始化string对象或者给string对象赋值
2、在string对象的加法运算中,可以使用以空字符结尾的字符数组作为其中一个运算对象,但是不能两个都是。在string的加法运算中,要至少保证有一个为string对象。例如:
char a[] = {‘a’,’\0’};
char b[] = {‘b’,’\0’};
string c = “abdc” ;
string d = “abcd” + a; //错误,赋值运算右侧没有string对象
string e = a+b; //错误,赋值运算右侧没有string对象
string f = c +a; //正确
string对象可以用以空字符结尾的字符数组进行操作,但是反过来却不行。不能用string对象对字符指针进行任何操作。不过为了完成从string对象到字符指针的转变,string专门提供了一个c_str成员函数(顾名思义,就是返回c的字符串指针):
string a = “hello world!”;
char *str = s; //错误
const char *str = s.c_str(); //正确
但是,这样的写法无法保证c_str函数返回的数组一直有效,因为如果后续操作改变了s的值,那么之前返回的数组可能就变了。 比如:
string d = "abc";
const char *c = d.c_str();
cout << c <<endl;
d = "efg";
cout << c<< endl;
则输出的结果为:
abc
efg
可以看出string对象变化了,即使我们没有将变化后的值重新赋值给c,但是其结果仍旧跟着变了。所以如果我们想保存当前的字符串,那么最好将结果重新拷贝一份。
标签:
原文地址:http://blog.csdn.net/autocyz/article/details/44132883