1. 所有搜寻函数的返回类型都是string::size_type,这是string class定义的一个无正负符号整数类型。
2. string对象的字符串末尾没有’/0’
3. 如果未搜寻到匹配位置,将返回string::npos,检验搜寻函数返回值必须使用string::size_type而不是int或unsigned。否则与string::npos的比较动作将无法有效运行。
4. 字符长度可以为任意值。如果其值大于实际剩余的字符数,则这些剩余字符都会被找到。如果使用string::npos,相当于指明“剩余所有的字符“。(p475)
5. 使用length()和size()计算字符串的字符个数时返回结果完全一样。但是他们是依照不同的设计原则执行了相同的动作,length()传回了字符串的长度,就好像C-string以strlen()所得结果一样,size()则是根据STL习惯而设的,用以表明元素数量。
6. 在比较时,int型和string::size_type不能直接比较,必须先把string::size_type转型为int,如果不转型,当带负号的i与不带正负号的类型相比较时,i会被自动转型为无正负号,如果此时for循环为:
for(int i=endIdx-1;i>=begIdx;--i) 如果i为负值,而begIdx为0,那么i>=begIdx永远为true。(C++标准程序库 p479)
7. 只有在单参数版本才把char*字符’/0’当做字符串结尾特殊符号来处理,其他所有情况下’/0’都不被视为特殊字符。(C++标准程序库p482)
8. 不能以单一字符来初始化某个字符串:
std::string s(‘x’); //error
但是你可以这么做:
std::string s(1,‘x’); //OK
这表示编译器提供了一个从const char*到string的自动类型转换,但不存在从char到string的自动类型转换。
9. C++standard将字符串字面常数由char*改为const char*。为了提供向下兼容性,C++standard规定const char*可隐式转换为char*。const char*可以自动转换为string,但是string不可自动转换为C-string。
10. 注意data() c_str() copy()三者的区别(C++标准程序库p484)
注意data(),c_str()返回的字符数组由该字符串拥有,也就是说调用者千万不可修改它或释放内存(这两个函数返回值都是const char*)。其原因是许多string实现的时候采用了引用机制,也就是说,有可能几个string使用同一个字符存储空间。而且你不能使用sizeof(string)来查看其大小。(为什么?)
注意data()和c_str()的区别:
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()的返回值有效期限在下一次调用non-const成员函数即告终止:
std::string s;
…
foo(s.c_str()); //s.c_str()始终有效,因为这里未使用一个临时变量来装它
const char* p;
p=s.c_str();
foo(p); //OK,这里p还是可用的
s+=”ext”;
foo(p); //此时p已经失效。因为是第二次调用non-const成员函数
再看下面一个例子:
string str("hello world");
const char* p = str.c_str();
str += "ext";
cout<<p<<endl; //这里会输出”hello worldext”,是否因为引用的原因?
11. string构造函数中,只有在单参数版本,才将char*字符’/0’当做字符串结尾特殊符号来处理:
string::string(const char* cstr) //产生一个字符串,以C-string cstr为初值,初值为cstr内以‘/0’为结束符号(但不包括’/0’)的所有字符
其他所有情况下’/0’都不被视为特殊字符:
std::string s1(5,’/0’); //将s1初始化为’/0’ ’/0’ ’/0’ ’/0’ ’/0’
12. 对于operator[]的const版本,最后一个字符的后面位置也是有效的。此时的实际字符数是有效索引,在此情况下operator[]返回值是由char型别之default构造函数所产生的字符,因此对于型别为string的对象,返回值是’/0’
其他情况,实际字符数都是个无效索引,如果使用该索引会引发异常或未定义行为。