Наш инструктор сказал нам, что строка - это массив символов, и мне было интересно, когда мы используем какой-либо массив статически, мы должны определить его размер перед компиляцией программы на C ++, тогда почему бы нам не сделать то же самое со строкой? Заранее спасибо.
3 ответа
Строка - это объект, который умнее массива символов. Массив символов - это просто выделение в памяти, с ним не связана никакая логика. Однако строка (поскольку это объект) может управлять своей собственной памятью и при необходимости расширяться. В C ++ можно перегружать операторы. Поскольку у строкового класса перегружены операторы [], вы можете использовать строку как массив и обращаться к отдельным символам. Однако, когда вы используете операторы [], вы фактически вызываете метод для строки (а именно оператор []).
Таким образом, вы можете создать строку, расширить ее, добавив к ней, и получить доступ к отдельным символам в ней:
string str1 = "Hello "; // create a string and assign value
string str2("World"); // use the constructor to assign a value
str1 += str2; // append one string to another
cout << str1[0]; // should print H
Но даже несмотря на то, что перегрузка оператора дает ощущение того же массива, на самом деле это объект.
Если говорить о char * arr = "hello world"; теперь здесь "hello world" предоставляется память через строковый объект, а объект инициализируется конструктором класса String.
Если мы скажем String str = "hello world"; здесь снова вызывается конструктор класса String, который инициализирует объект str класса String, чтобы он указывал на начальный адрес «hello world», который хранится где-то в памяти.
Здесь нам не нужно указывать размер, вместо этого конструктор строкового класса выполняет весь трюк по выделению динамической памяти и инициализации.
Компилятор может автоматически выбирать размер массива в соответствии с его исходным содержимым, например:
int a[] = { 3, 5, 2 };
Так что это не то, что есть у строковых литералов, а у других массивов нет.
Похожие вопросы
Новые вопросы
c++
C ++ - это язык программирования общего назначения. Первоначально он был разработан как расширение C и имеет аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде (который должен быть) скомпилирован с помощью компилятора C ++. Используйте тег для конкретной версии для вопросов, связанных с конкретной версией стандарта [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] или [C ++ 23] и т. Д. .