2013-07-17 69 views
3
std::string test("this is a test string"); 
test[0] = 'b'; 

像上面的代碼,該字符串的一部分已經改變,將編譯器生成一個新的字符串或做舊的修改?C++字符串類是隻讀的嗎?

回答

10

test[0]將返回一個非const(因爲字符串對象是非const)對第一個字符的引用,該字符將被成功替換爲b字符。

看的reference

2

您將修改現有string

2

按照documentation操作[]將這個索引處返回上的字符的參考。

如果字符串對象是const限定的,則函數返回一個常量字符&。否則,它將返回一個字符&。

如果字符串是不變的,你就不能修改它,否則,你將能夠改變原始字符串

4

不,你正在修改舊的。如果你想有一個字符串對象只讀的,你需要常量

std::string const test("this is a test string"); 
test[0] = 'b'; // compile error. 
+0

它值得一提的是,聲明對象作爲'const'不使其真正只讀的,你說出它,因爲常量性可能被拋棄。 – Kolyunya

+2

@Kolyunya,但它會是未定義的行爲來執行任何非常量的操作。 – juanchopanza

+0

@ juanchopanza謝謝你的信息,我不知道! '7.1.5.1/4:除了任何聲明mutable的類成員(7.1.1)都可以被修改外,任何在其生命週期(3.8)期間修改const對象的嘗試都會導致未定義的行爲。' – Kolyunya

0

string構造函數將字符數組複製。第二行將修改該副本。

+0

其實沒有構造函數可以複製的字符串;它會將*字符數組*複製到新創建的字符串中。 – celtschk

+0

我認爲一個'char'數組是C風格的字符串。但是,我會改變文字。 –

1

teststd::string將成爲「bhis是測試字符串」,因爲您可以更改它。 用於構造字符串的字符串文字"this is a test string"不會更改。

0

C++ std字符串是mutable,他們是可以改變的。在這種情況下,字符串將進行修改而不是實例化新的字符串對象。