Глава 3. Базовые типы данных, переменные
61
n
— тоже один символ, как и длина
s
. Тот, кто изучал С++, будет в не-
доумении. В полном. Однако и длина строки не может, увы, служить
показателем отличия в типах
char
и
string
.
Посмотрим на структуру, скажем так, ячейки памяти, в которой разме-
щается строка. Знаем, что в ячейке должны размещаться символы из
таблицы Unicode. Сколько? От "ничего" до "сколько хочешь". Когда мы
пишем
string s="";
(две кавычки подряд), то в
s
и будет "ничего". Пус-
тая строка, как говорят. По идее, ее длина должна быть нулем. Прове-
рим это по программе вышеописанным способом, задав строку
string
s="";
. Действительно,
n=0
. А что касается, "сколько хочешь", то содер-
жимое переменной типа
string
действительно может динамически из-
меняться в сторону увеличения и/или уменьшения. Что же касается рос-
та в сторону увеличения, то здесь возможны только технические огра-
ничения.
Вспомним теперь, что числовые и булевы типы данных не раздуваются
и не сужаются. Сколько им памяти выделено, столько и остается за ни-
ми. Такие типы называют
типами-значениями
. Они хранятся в стековой
памяти программы. За памятью, занимаемой ими, следить особенно не
надо: они удаляются из памяти по мере того, как завершается работа
того блока, в котором они объявлены. А вот динамически меняющие
свои размеры переменные (к таким, как мы видим, относится тип
string
) требуют особого надзора за собой и поэтому размещаются не в
блоке, где они объявлены, а в специальном пространстве, которое раз-
работчики назвали
кучей
. Типы, данные которых размещаются в куче,
называются
ссылочными
, т. к. наряду со значениями, присущими таким
типам данных, как набор символов Unicode в
string
, они содержат и
ссылку, т. е. адрес, связывающий их со своим местом в стеке (а в стеке
же хранятся ссылки на ссылочные данные, а их начало — в управляе-
мой куче), чтобы специальный механизм очищал кучу от их присутст-
вия, когда в этом возникнет необходимость, и куча не переполнялась.
Поэтому ячейка памяти для строки состоит из двух частей: собственно
строки и адреса ее начала в стеке. Со ссылками очень удобно работать:
если вы копируете одну строку в другую, то не надо перегонять огром-
ное количество символов из одной строки в другую. Достаточно скопи-
ровать в другую строку только ссылку, которая указывает, где находят-
ся данные, которые, якобы, копируются из исходной строки. Вот такова
разница (и существенная) между строкой из одного символа и перемен-
ной типа
char
, по определению состоящей тоже из одного символа.
Для строк определены операции сравнения:
==
(равно),
!=
(не равно),
+
(сцепление (конкатенация)).
62
Do'stlaringiz bilan baham: |