2013-07-23 107 views

回答

9

&myString[0]是類型std::string

否的對象事實並非如此。 myString[0]是對字符串的第一個字符的引用; &myString[0]是一個指向那個角色的指針。運營商的優先級是這樣的,即它意味着&(myString[0])而不是(&mystring)[0]

請注意,以這種方式訪問​​,不能保證字符串將以零終止;所以如果你在一個C風格的函數中使用它,這個函數需要一個以零結尾的字符串,那麼你將依賴未定義的行爲。

+1

「不保證字符串將被零終止」在C++ 03中爲true,但C++ 11確實有保證。 –

+6

@TonyD:不,C++ 11並不保證連續存儲的字符在它們後面會有一個零;只是'str [size]'會給出一個零值的引用,'c_str()'的結果將被終止。 –

+0

@MikeSeymour:我想知道爲什麼規範使它變得如此複雜。只需保存一個字節? – Nawaz

3

它與operator precedence有關。 []運算符的優先級高於運算符地址&,所以運算符地址對字符串operator[]函數返回的字符引用起作用。

+0

+1表示優先。從語法看這是一個不同的角度。 – Nawaz

1

你錯了。 &myString[0]不是std::string類型,它是char *類型。

[]操作者具有較高的優先級和operator[]返回到char的引用,其地址(&操作者)是char *類型。

1

std::string類型有一個operator[],它允許索引字符串中的每個字符。表達式myString[0]是對字符串的第一個字符的(可修改的)引用。如果你採用這個地址,你會得到一個指向數組中第一個字符的指針。

2

運算符[]std::string::char& operator[] (size_t pos))重載會返回索引處字符的引用。你正在採取這種字符引用的地址,這很好。

因此,myString[0]返回類型不是std::string而是char&

沒有理由這樣做。您可以直接做 -

myString[0] = 'h'; 
2

的的std :: string方法c_str()operator[]2 diferent方法,它返回兩個不同的類型。

方法c_str()確實返回const char*

const char* c_str() const; 

但是,方法operator []返回char的引用。當你把它的地址,你得到一個字符的地址。

 char& operator[] (size_t pos); 
const char& operator[] (size_t pos) const; 
4

conststd::string::operator[](size_type pos)const重載,和非const版本返回char&,所以你可以做這樣的事情

std::string s("Hello"); 
s[0] = 'Y'; 

需要注意的是,由於s[0]返回char&,然後&s[0]是元素地址s[0]。您可以將該地址分配給char*。這是由你不要誤用這個指針。

相關問題