Выбрать главу
Прямая инициализация и инициализация копией

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

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

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

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

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

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

string s8 = string(10, 'c'); // инициализация копией; s8 - сссссссссс

Инициализатор строки s8string(10, 'c') — создает строку заданного размера, заполненную указанным символьным значением, а затем копирует ее в строку s8. Это эквивалентно следующему коду:

string temp(10, 'c'); // temp - сссссссссс

string s8 = temp;     // копировать temp в s8

Хотя используемый для инициализации строки s8 код вполне допустим, он менее читабелен и не имеет никаких преимуществ перед способом, которым была инициализирована переменная s7.

3.2.2. Операции со строками

Наряду с определением способов создания и инициализации объектов класс определяет также операции, которые можно выполнять с объектами класса. Класс может определить обладающие именем операции, такие как функция isbn() класса Sales_item (см. раздел 1.5.2). Класс также может определить то, что означают различные символы операторов, такие как << или +, когда они применяются к объектам класса. Наиболее распространенные операции класса string приведены в табл. 3.2.

Таблица 3.2. Операции класса string

os << s Выводит строку s в поток вывода os. Возвращает поток os
is >> s Читает разделенную пробелами строку s из потока is. Возвращает поток is
getline(is, s) Читает строку ввода из потока is в переменную s. Возвращает поток is
s.empty() Возвращает значение true, если строка s пуста. В противном случае возвращает значение false
s.size() Возвращает количество символов в строке s
s[n] Возвращает ссылку на символ в позиции n строки s; позиции отсчитываются от 0
s1 + s2 Возвращает строку, состоящую из содержимого строк s1 и s2
s1 = s2 Заменяет символы строки s1 копией содержимого строки s2
s1 == s2 s1 != s2 Строки s1 и s2 равны, если содержат одинаковые символы. Регистр символов учитывается
<, <=, >, >= Сравнение зависит от регистра и полагается на алфавитный порядок символов