Наш инструктор сказал нам, что строка - это массив символов, и мне было интересно, когда мы используем какой-либо массив статически, мы должны определить его размер перед компиляцией программы на C ++, тогда почему бы нам не сделать то же самое со строкой? Заранее спасибо.

0
Nilesh Kumar 3 Мар 2015 в 19:26

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

Но даже несмотря на то, что перегрузка оператора дает ощущение того же массива, на самом деле это объект.

1
onetamer 3 Мар 2015 в 17:52

Если говорить о char * arr = "hello world"; теперь здесь "hello world" предоставляется память через строковый объект, а объект инициализируется конструктором класса String.

Если мы скажем String str = "hello world"; здесь снова вызывается конструктор класса String, который инициализирует объект str класса String, чтобы он указывал на начальный адрес «hello world», который хранится где-то в памяти.

Здесь нам не нужно указывать размер, вместо этого конструктор строкового класса выполняет весь трюк по выделению динамической памяти и инициализации.

0
Ravender Singh Dahiya 3 Мар 2015 в 16:40

Компилятор может автоматически выбирать размер массива в соответствии с его исходным содержимым, например:

int a[] = { 3, 5, 2 };

Так что это не то, что есть у строковых литералов, а у других массивов нет.

2
Ben Voigt 3 Мар 2015 в 16:33