2013-07-23 108 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*。这是由你不要误用这个指针。

相关问题