在C++
中,我可以像这样做...
String s = "abc";
char c = s[i]; // works fine...
但在Java
中,如果我尝试做同样的事情,它会抛出一个错误。为什么?
在java
中,要实现以上功能,我必须执行:
s.toCharArray();
C++中字符串的实现与Java中有何不同之处?
char c = s.charAt(i);
String
类不公开任何类型的“索引”运算符;那只存在于数组中,而String
不是数组。(它通常使用数组来实现,但这是另一回事。)+
运算符在字符串中被特殊处理-就在语言规范中。同样的事情也可以发生在[]
上,但它没有被处理-由于它不在语言规范中,并且Java不支持重载运算符,因此无法在库代码中执行。(例如,您不能为任何其他类提供自定义行为+
。)不同之处在于C++具有运算符重载,并使用它来访问字符串内容。
它们都以一种无法更改字符串字符的方式存储字符串字符。
string s = "abc";
char c = s[i];
string
类重载了下标运算符(即[]运算符),使程序员可以像访问数组元素一样访问string
对象的字符,尽管string
对象并不是一个数组。+
运算符),因此,不能为String
对象重载下标运算符。在Java中,要访问字符串的字符,需要使用访问器成员方法,例如charAt
。还可以调用String
类的toCharArray
方法,该方法返回字符串对象的字符数组,并且可以对此返回值使用下标运算符:char c = s.toCharArray()[i];
查看方法 String#charAt
返回指定索引处的字符值。索引范围从0到length() - 1。序列的第一个char值位于索引0处,下一个char值位于索引1处,依此类推,就像数组索引一样。
如果由索引指定的char值是代理项,则返回代理项值。
public char charAt(int index)
在C++中,字符串已经被视为字符数组,但在Java中,String是一个内置类,它与字符数组不同。
std::string
不是字符数组。例如,它有一个size()
成员,而char[]
则没有。字符串_字面值_是字符数组。例如,"hello"
是一个char[6]
。 - MSaltersjava.lang.String
的对象,因此您无法通过索引处理它们。
s[i]
,你应该问自己在C++中什么使它有效。 - Jon Skeets + s
。如果将String
视为特殊情况,则定义s[i]
同样合理。 - MSalters+
对于字符串有特殊的含义,但仅限于此。我会在答案中做出说明。 - Jon Skeetstd::string
没有任何特殊的地位。它只是标准库中的一个类。它使用了运算符重载等语言特性,但这些特性对所有人都是可用的。特别是,你可以自己创建一个完全相同的类。 - MSalters