码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-03-08 15:48:05      阅读:127      评论:0      收藏:0      [点我收藏+]

标签:


我们都知道可以用已下方式来初始化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,但是其结果仍旧跟着变了。所以如果我们想保存当前的字符串,那么最好将结果重新拷贝一份。

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

标签:

原文地址:http://blog.csdn.net/autocyz/article/details/44132883

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!