字符串数据成员有什么意义?

时间:2009-09-11 06:43:53

标签: c++ string

String data

我特别困惑的是这句话

“只有在下次调用字符串对象的非常量成员函数之前,它的内容才能保持不变。”

有人可以澄清这是什么意思吗?何时使用此以及何时避免使用此功能?

3 个答案:

答案 0 :(得分:5)

它们意味着您可以存储指针并在以后使用它。如果在两次访问之间调用某些非const方法,则存储指针所设置的缓冲区内容可能会发生变化,您将面临意外行为。

答案 1 :(得分:4)

const char* data() const;

这是说调用const char *返回的str.data()不会改变,除非有人修改它来自的字符串。一旦有人调用非常量成员函数,返回的指针可能无效,或者可能指向与str.data()函数返回后立即指向的数据不同的数据。

这意味着您可以将返回的数据传递给C函数。这意味着你不应该做这样的事情:

const char *old = str.data();
size_t      len = str.length();
...call a function that modifies str...
// cout << old << endl;
// Since old is not guaranteed to be null terminated (thanks MSalter),
// do something else with the old data instead of writing to cout.
// Inventiveness not at a high this morning; this isn't a particularly
// good example of what to do - a sort of string copy.
char buffer[256];
memcpy(buffer, old, MIN(sizeof(buffer)-1, len));
buffer[len] = '\0'; 

I / O 内存复制完成时,old可能不再有效,len也可能不正确。

答案 2 :(得分:1)

有时,您需要访问格式化为字符数组的字符串 - 通常是因为您需要将字符串传递给某个函数,该函数需要这样的字符串(例如strcmp)。您可以使用datac_str成员执行此操作,但您必须遵守在您提供的链接中明确说明的调用函数的规则:

  

返回的数组指向   内部位置不应该   直接在程序中修改。它的   内容保证保留   只有到下次通话才会改变   一个非常数的成员函数   字符串对象。

您无法修改字符数组 - 字符串对象假设您不这样做,如果这样做会导致未定义的行为。