Std::string
C++标准库中的string class 使你可以将string 当作一个一般的型别而不会令用户感觉有任何问题。你可以像对待基本型别那样地复制、赋值、和比较string,再不必担心内存是否足够、占用内存实际长度等问题。
由于字符串字面常数(“Hello,World”)的型别并非string,因此在新的string和C-String之间必须存在一种强烈关系:在string的操作场合(比较,追加,插入等等动作)都应该可以使用C-string。具体的说存在一个从const char*到string的隐式型别转换。
有三个函数可以将字符串内容转换为字符数组和C-String:
1. data() 以字符数组的形式返回字符串内容。由于并未追加’\0’字符,所以返回型别并非有效的C-String.
2. c_str() 以C_String形式返回字符串内容,也就是在尾端添加’\0’字符。
3. copy() 将字符串内容复制到“调用者提供的字符数组“中。不添加’\0’字符。
注意,data()和c_str()返回的字符数组由该字符串拥有。也就是说调用者千万不可以修改它或释放其内存。请注意c_str()和data()的返回值有效期限在下一次调用string的non-const成员函数时即告终止。
std::string s;
…
foo(s.s_str());
const char* p;
p = s.c_str();
foo(p);
s += “ext”;
foo(p) // 此时p是无效的了
如果搜寻函数失败则返回string::npos
std::string s;
std::string::size_type idx; // be careful:don't use any other type!
// ...
idx = s.find(“substring”)
if (idx == std::string::npos)
{
// …
}
使用string的npos值及其型别时要格外小心: 若要检查返回值,一定要使用型别string::size_type,不能以int或unsigned作为返回值型别;否则返回值与string::npos之间的比较可能无法正确执行。这时应为npos被设置为-1;
String采用了引用技术概念,通过reference counting,你甚至不必透过const reference来传递字符串;不过基于灵活性和可移植性的考虑,一般还是应该采用const reference来传递参数。