string类详解

来源:互联网 发布:淘宝直播点哪儿抢红包? 编辑:程序博客网 时间:2024/05/18 00:55

该内容是我在看完C++ Primer Plus中string这一章后的总结和理解,呵呵~~~

string类有6个构造函数:

string(const char *s) 将string对象初始化为s指向的NBTS(传统的C风格字符串)

[例]

string one("Lottery Winner!")

string(size_type n, char)创建一个包含n个元素的string对象,其中每个元素都被初始化为字符c

size_type是一个依赖于实现的整型

[例]

string teo(20,'$');

sting(const string &str, size_type n = npos)将string对象初始化为对象str中从位置pos开始到结尾的字符,或从位置pos开始的n个字符

string类将string::npos定义为字符串的最大长度,通常为无符号int的最大值。

[例]

string three(one);

string()创建一个默认的string对象,长度为0

[例]

string four

string(const char *s, aixe_type n)将string对象初始化为s指向的NBTS中的前n个字符,即使超过了NBTS结尾

[例]

char alls[] = "All's well that ends well";

string five(als,20);

template<class Iter> string(Iter begin, Iter end)将string对象初始化为去见[begin,end]内的字符,其中begin和end的行为就象指针,用于指定位置,范围包括begin在内,但不包括end

string six(alls+6, alls +10);

cout <<six<<". "

string seven(&five[6], &five[10]);

cout << seven << ".../n";

 

string内存分配的特定

string类中必有一个私有成员,其是一个char*,用户记录从堆上分配内存的地址,其在构造时分配内存,在析构时释放内存。因为是从堆上分配内存,所以string类在维护这块内存上是格外小心的,string类在返回这块内存地址时,只返回const char*,也就是只读的,如果你要写,你只能通过string提供的方法进行数据的改写

 

string 和 C风格字符串

在C语言中只有char* 和 const char*,为了使用起来方便,string提供了三个函数满足其要求:

const charT* c_str() const
const charT* data() const
size_type copy(charT* buf, size_type n, size_type pos = 0) const

 

其中:

  1. c_str 直接返回一个以/0结尾的字符串。
  2. data 直接以数组方式返回string的内容,其大小为size()的返回值,结尾并没有/0字符。
  3. copy 把string的内容拷贝到buf空间中。

你或许会问,c_str()的功能包含data(),那还需要data()函数干什么?看看源码:

const charT* c_str () const{ if (length () == 0) return ""; terminate (); return data (); }

原来c_str()的流程是:先调用terminate(),然后在返回data()。因此如果你对效率要求比较高,而且你的处理又不一定需要以/0的方式结束,你最好选择data()。但是对于一般的C函数中,需要以const char*为输入参数,你就要使用c_str()函数。

对于c_str() data()函数,返回的数组都是由string本身拥有,千万不可修改其内容。其原因是许多string实现的时候采用了引用机制,也就是说,有可能几个string使用同一个字符存储空间。而且你不能使用sizeof(string)来查看其大小

另外在你的程序中,只在需要时才使用c_str()或者data()得到字符串,每调用一次,下次再使用就会失效,如:

string strinfo("this is Winter");
...//最好的方式是:foo(strinfo.c_str());//也可以这么用:const char* pstr=strinfo.c_str();foo(pstr);//不要再使用了pstr了, 下面的操作已经使pstr无效了。strinfo += " Hello!";foo(pstr);//错误!
会遇到什么错误?当你幸运的时候pstr可能只是指向"this is Winter Hello!"的字符串,如果不幸运,就会导致程序出现其他问题,总会有一些不可遇见的错误。总之不会是你预期的那个结果。
string 建议
使用string 的方便性就不用再说了,这里要重点强调的是string的安全性。 
  • string并不是万能的,如果你在一个大工程中需要频繁处理字符串,而且有可能是多线程,那么你一定要慎重(当然,在多线程下你使用任何STL容器都要慎重)。 
  • string的实现和效率并不一定是你想象的那样,如果你对大量的字符串操作,而且特别关心其效率,那么你有两个选择,首先,你可以看看你使用的STL版本中string实现的源码;另一选择是你自己写一个只提供你需要的功能的类。 
  • string的c_str()函数是用来得到C语言风格的字符串,其返回的指针不能修改其空间。而且在下一次使用时重新调用获得新的指针。 
  • string的data()函数返回的字符串指针不会以'/0'结束,千万不可忽视。
  • 尽量去使用操作符,这样可以让程序更加易懂(特别是那些脚本程序员也可以看懂) 

 

原创粉丝点击