Начиная с этого момента подразумевается, что во все примеры включены объявления using
для имен из стандартной библиотеки. Таким образом, в тексте и примерах кода далее упоминается cin
, а не std::cin
.
Кроме того, для экономии места в примерах кода не будем показывать далее объявления using
и необходимые директивы #include
. В табл. А.1 приложения А приведены имена и соответствующие заголовки стандартной библиотеки, которые использованы в этой книге.
#include
и using
в свои примеры перед их компиляцией.
Упражнение 3.1. Перепишите упражнения из разделов 1.4.1 и 2.6.2, используя соответствующие объявления using
.
string
string
, необходимо включить в код заголовок string
. Поскольку тип string
принадлежит библиотеке, он определен в пространстве имен std
. Наши примеры подразумевают наличие следующего кода:
#include
using std::string;
В этом разделе описаны наиболее распространенные операции со строками; а дополнительные операции рассматриваются в разделе 9.5.
Каждый класс определяет, как могут быть инициализированы объекты его типа. Класс может определить много разных способов инициализации объектов своего типа. Каждый из способов отличается либо количеством предоставляемых инициализаторов, либо типами этих инициализаторов. Список наиболее распространенных способов инициализации строк приведен в табл. 3.1, а некоторые из примеров приведены ниже.
string s1; //
string s2 = s1; //
string s3 = "hiya"; //
string s4(10, 'c'); //
Инициализация строки по умолчанию (см. раздел 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
начнем изучать, чем эти формы отличаются друг от друга. Когда переменная инициализируется с использованием знака =
, компилятор просят скопировать инициализирующий объект в создаваемый объект, т.е. выполнить =
осуществляется
Когда имеется одиночный инициализатор, можно использовать и прямую форму, и инициализацию копией. Но при инициализации переменной несколькими значениями, как при инициализации переменной s4
выше, следует использовать прямую форму инициализации.
string s5 = "hiya"; //
string s6("hiya"); //
string s7(10, 'c'); //
Если необходимо использовать несколько значений, можно применить косвенную форму инициализации копией при явном создании временного объекта для копирования.
string s8 = string(10, 'c'); //