我感到特別困惑的是這種說法
「其內容是保證不變只有等到字符串對象的非恆定的成員函數的下一個電話。」
有人能澄清這是什麼意思?何時使用此以及何時避免使用此?
我感到特別困惑的是這種說法
「其內容是保證不變只有等到字符串對象的非恆定的成員函數的下一個電話。」
有人能澄清這是什麼意思?何時使用此以及何時避免使用此?
有時,您需要訪問格式爲字符數組的字符串 - 通常是因爲您需要將字符串傳遞給某個需要字符串的函數(例如strcmp
)。您可以通過使用data
或c_str
成員做到這一點,但你必須尊重調用它們在你提供的鏈接清楚地闡明的功能的規則:
返回數組指向一個 內部位置,其不應該在程序中直接修改 。其 內容保證保持 不變,直到 的下一個 字符串對象的非常數成員函數爲止。
您不能修改字符數組 - 字符串對象假定您沒有,如果這樣做會導致未定義的行爲。
它們表示您可以存儲指針並稍後使用它。如果在兩次訪問之間調用某個非const方法,則存儲的指針所設置的緩衝區內容可能會更改,並且您將面臨意外行爲。
const char* data() const;
這是說,const char *
通過調用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
可能是不正確的。
此外: 通常對字符串的操作會導致包裝在字符串中的c字符串發生更改。由於像append這樣的操作需要重新分配c-string,因此之前的內存位置被釋放並且不再使用。 – Basilevs 2009-09-11 07:00:05
「通常」是重要的詞,因爲std :: string的一些實現不包裝C字符串(最常見的異常是在包裝的char []中沒有\ 0) – MSalters 2009-09-11 09:46:56
哦,該示例是錯誤的BTW:cout需要以空字符結尾的字符串,而data()通常不是。 – MSalters 2009-09-11 09:47:47