Разница между строками в С++ и Java

В C++ я могу сделать что-то вроде этого...

String s = "abc";
char c = s[i]; // works fine...

Но в Java, если я попытаюсь сделать то же самое, он выдает ошибку. Почему?.

В Java, для достижения вышеизложенного, я должен сделать:

s.toCharArray(); 

Как реализация строк в C++ отличается от реализации в Java?

Ответ 1

В java, для достижения вышеизложенного, я должен сделать:     s.toCharArray();

Не совсем. Вместо этого вы можете использовать charAt:

char c = s.charAt(i);

В принципе, С++ допускает пользовательские операторы - Java - нет. Таким образом, класс String не выставляет никакого оператора "индексации"; который существует только для массивов, а String не является массивом. (Обычно он реализуется с использованием массива, но это другое дело.)

ИЗМЕНИТЬ: Как отмечено в комментариях, оператор + имеет специальную форму для строк - прямо в спецификации языка. То же самое можно было бы сделать для [], но это не так - и, как это не указано в спецификации языка, а Java не поддерживает перегруженные операторы, это невозможно выполнить в библиотечном коде. (Например, вы не можете дать пользовательское поведение + для любого другого класса.)

Ответ 2

Отличие состоит в том, что С++ имеет перегрузку оператора и использует его для доступа к содержимому строки.

Они оба сохраняют строковые символы таким образом, что вы не можете их изменить.

Ответ 3

См. метод Строка # charAt

Возвращает значение char по указанному индексу. Индекс колеблется от 0 до длины() - 1. Первое значение char последовательности имеет индекс 0, следующий в индексе 1 и т.д., Как для индексации массива.

Если значение char, указанное индексом, является суррогатом, возвращается суррогатное значение.

public char charAt(int index)

Ответ 4

в С++ строки уже рассматриваются как массив символов, но в java String - встроенный класс. он отличается от массива символов.

Ответ 5

Причина, по которой можно написать

string s = "abc";
char c = s[i]; 

в С++ заключается в том, что класс string перегрузил оператор индексирования (например, оператор []), который позволяет программистам обращаться к символам объекта string так же, как к ним обращаться к элементу массива, несмотря на то, что что объект string не является массивом.

Java, с другой стороны, не допускает перегрузки оператора любого типа (единственным исключением является оператор +, который перегружен для строк), и, следовательно, оператор индексирования не может и не может быть перегружен для string объектов. В Java, чтобы получить доступ к символу строки, вам необходимо использовать методы элемента доступа, например charAt. Вы также можете вызвать метод toCharArray класса string, который возвращает вам массив символов строкового объекта, и вы можете использовать оператор индексирования с этим возвращаемым значением:

char c = s.toCharArray()[i];

Ответ 6

В С++ строка обычно представляет собой массив символов (или указатель на), завершаемый символом NULL (\ 0). Вы можете обрабатывать строку, индексируя также, как вы обрабатывали любой массив.
Но в Java строки не являются массивами. Строки Java - это объекты типа java.lang.String, поэтому вы не можете обрабатывать их путем индексирования.