2015-03-03 6 views
0

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

+1

Синтаксический сахар (компилятор знает длину, потому что он может считать символы в строковом литерале). В стороне, инструктор C++, вероятно, должен сказать, что строки являются экземплярами класса 'std :: string', а не массивами' char'. –

+1

'std :: string' - это класс, который инкапсулирует строку. AC «string» в C++ * представляет собой * массив символов и должен быть объявлен с размером (например, «char buffer [256]') или использоваться как строковый литерал (например, «Hello, World!») (Не всегда взаимозаменяемые). – crashmstr

+0

Как компилятор знает длину строки, когда мы берем ввод от пользователя в строке? Пользователь может давать строки разной длины. –

ответ

1

Строка - это объект, который умнее массива символов. Массив символов - это просто распределение в памяти, у него нет связанной с ним логики. Однако строка (потому что это объект) может управлять собственной памятью и расширяться по мере необходимости. В C++ вы можете перегружать операторов. Поскольку в строковом классе перегружены операторы [], вы можете использовать строку в виде массива и получить доступ к отдельным символам. Однако, когда вы используете операторы [], вы фактически вызываете метод в строке (а именно operator[ ]).

Таким образом, вы можете создать строку, расширить, добавив к нему, и получить доступ к отдельным символам в нем:

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 

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

2

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

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

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

0

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

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

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

Смежные вопросы