string对象和C风格代码的混用

我们都知道可以用已下方式来初始化string对象:

strings(“helloworld!”);

实际上我们也可以通过这样的方式来实现:

charc[]={‘h’,‘e’,‘l’,‘l’,‘o’,‘ ‘,‘w’,‘o’,‘r’,‘l’,‘d’,‘!’,‘\0’};

strings=c;

但是如果数组c不是以空字符结尾的话,那么上面的赋值就是不正确的。

实际上,任何出现字符串字面值(即上面的“helloworld!”这种形式)的地方都可以用以空字符结束的字符数组来替代。注意点如下:

1、可以使用以空字符结尾的字符数组来初始化string对象或者给string对象赋值

2、在string对象的加法运算中,可以使用以空字符结尾的字符数组作为其中一个运算对象,但是不能两个都是。在string的加法运算中,要至少保证有一个为string对象。例如:

chara[]={‘a’,’\0’};

charb[]={‘b’,’\0’};

stringc=“abdc”;

stringd=“abcd”+a;//错误,,赋值运算右侧没有string对象

stringe=a+b;//错误,赋值运算右侧没有string对象

stringf=c+a;//正确

string对象可以用以空字符结尾的字符数组进行操作,但是反过来却不行。不能用string对象对字符指针进行任何操作。不过为了完成从string对象到字符指针的转变,string专门提供了一个c_str成员函数(顾名思义,就是返回c的字符串指针):

stringa=“helloworld!”;

char*str=s;//错误

constchar*str=s.c_str();//正确

但是,这样的写法无法保证c_str函数返回的数组一直有效,因为如果后续操作改变了s的值,那么之前返回的数组可能就变了。比如:

stringd="abc";

constchar*c=d.c_str();

cout<<c<<endl;

d="efg";

cout<<c<<endl;

则输出的结果为:

abc

efg

可以看出string对象变化了,即使我们没有将变化后的值重新赋值给c,但是其结果仍旧跟着变了。所以如果我们想保存当前的字符串,那么最好将结果重新拷贝一份。

也有伤心的,既有令人兴奋的,也有令人灰心的,

string对象和C风格代码的混用

相关文章:

你感兴趣的文章:

标签云: