В разделе 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 - сссссссссс
Инициализатор строки s8 — string(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 равны, если содержат одинаковые символы. Регистр символов учитывается |
<, <=, >, >= |
Сравнение зависит от регистра и полагается на алфавитный порядок символов |