×
Traktatov.net » Язык программирования C++. Пятое издание » Читать онлайн
Страница 71 из 714 Настройки
.

3.2. Библиотечный тип >string

Строка (string) — это последовательность символов переменной длины. Чтобы использовать тип >string, необходимо включить в код заголовок >string. Поскольку тип >string принадлежит библиотеке, он определен в пространстве имен >std. Наши примеры подразумевают наличие следующего кода:

>#include

>using std::string;

В этом разделе описаны наиболее распространенные операции со строками; а дополнительные операции рассматриваются в разделе 9.5.

Кроме определения операций, предоставляемых библиотечными типами, стандарт налагает также требования на эффективность их конструкторов. В результате библиотечные типы оказались весьма эффективны в использовании.

3.2.1. Определение и инициализация строк

Каждый класс определяет, как могут быть инициализированы объекты его типа. Класс может определить много разных способов инициализации объектов своего типа. Каждый из способов отличается либо количеством предоставляемых инициализаторов, либо типами этих инициализаторов. Список наиболее распространенных способов инициализации строк приведен в табл. 3.1, а некоторые из примеров приведены ниже.

>string s1;          // инициализация по умолчанию; s1 - пустая строка

>string s2 = s1;     // s2 - копия s1

>string s3 = "hiya"; // s3 - копия строкового литерала

>string s4(10, 'c'); // s4 - cccccccccc

Инициализация строки по умолчанию (см. раздел 2.2.1) создает пустую строку; т.е. объект класса >string без символов. Когда предоставляется строковый литерал (см. раздел 2.1.3), во вновь созданную строку копируются символы этого литерала, исключая завершающий нулевой символ. При предоставлении количества и символа строка содержит указанное количество экземпляров данного символа.


Таблица 3.1. Способы инициализации объекта класса >string

>string s1Инициализация по умолчанию; >s1 — пустая строка
>string s2(s1)>s2 — копия >s1
>string s2 = s1Эквивалент >s2(s1), >s2 — копия >s1
>string s3("value")>s3 — копия строкового литерала, нулевой символ не включен
>string s3 = "value"Эквивалент >s3("value"), >s3 — копия строкового литерала
>string s4(n, 'c')Инициализация переменной >s4 символом >'c' в количестве >n штук
Прямая инициализация и инициализация копией

В разделе 2.2.1 упоминалось, что язык С++ поддерживает несколько разных форм инициализации. Давайте на примере класса >string начнем изучать, чем эти формы отличаются друг от друга. Когда переменная инициализируется с использованием знака >=, компилятор просят скопировать инициализирующий объект в создаваемый объект, т.е. выполнить инициализацию копией (copy initialization). В противном случае без знака >= осуществляется прямая инициализация (direct initialization).

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

>string s5 = "hiya"; // инициализация копией

>string s6("hiya");  // прямая инициализация

>string s7(10, 'c'); // прямая инициализация; s7 - сссссссссс

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