Партнерка на США и Канаду по недвижимости, выплаты в крипто
- 30% recurring commission
- Выплаты в USDT
- Вывод каждую неделю
- Комиссия до 5 лет за каждого referral
Виртуальные базовые классы инициализируются (вызывается void-конструктор) перед любыми не виртуальными базовыми классами и в том порядке, в котором они появляются в ПАГе наследования при просмотре его снизу-вверх и слева направо.
Если виртуальный базовый класс имеет хотя бы один конструктор, то он должен иметь void-конструктор.
Ключевое слово virtual в классе Cow и классе Buffalo предотвращает многократное копирование полей данных weight, price, color из предков класса Beefalo.
8. Строки в С++
8.1. Основные понятия. Класс string
«Стандартные классы просто так в состав С++ не добавляются», Г. Шилдт
C++ не содержит стандартного типа данных «строка». Вместо этого он поддерживает массивы символов, завершаемые нуль-символом.
Библиотека содержит функции для работы с такими массивами, унаследованные от С и описанные в заголовочном файле <str1ng. h> (<cstr1ng>). Они позволяютдостичь высокой эффективности, но весьма неудобны и небезопасны в использовании, поскольку выход за границы строки не проверяется.
Тип данных string стандартной библиотеки лишен этих недостатков, но может проигрывать массивам символов в эффективности. Основные действия со строками выполняются в нем с помощью операций и методов, а длина строки изменяется динамически в соответствии с потребностями.
Для использования класса необходимо подключить к программе заголовочный файл <str1ng>i.
Пример 8.1:
#1nclucie <cstr1ng>
#include <str1ng>
#1nclude <1ostreaiTi>
using namespace std;
1nt main (){
char cl[80]. c2[80]. сЗЕбО];// Строки с завершающим нулем
string s i. s2. s3;
// Присваивание строк
strcpyCcl. "old string one"):
strcpy(c2. cl):
sl = "new string one";
s2 = s l;
/ / Конкатенация строк
strcpy(c3. cl);
strcpy(c3. c2);
s3 = sl + s2;
/ / Сравнение строк
i f (strcmp(c2. c3) < 0 ) cout « c2;
else cout « c3;
i f (s2 < s3) cout « s2;
else cout « s3;
}
Как видно из примера, выполнение любых действий со строками старого стиля требует использования функций и менее наглядно. Кроме того, необходимо проверять, достаточно ли места в строке-приемнике при копировании, то есть фактически код работы со строками старого стиля должен быть еще более длинным. Строки типа string защищены от выхода информации за их границы и с ними можно работать так же, как с любым встроенным типом данных, то есть с помощью операций.
Рассмотрим основные особенности и приемы работы со строками.
8.2. Конструкторы, операции и методы класса string
Конструкторы и присваивание строк. В классе string определено несколько конструкторов. Заголовки наиболее употребительных: string(); string(const char *); string(const char *. int n); string(string &);
Первый конструктор создает пустой объект типа string. Второй создает объект типа string на основе строки старого стиля, третий создает объект типа string и записывает туда п символов из строки, указанной первым параметром. Последний конструктор является конструктором копирования, который создает новый объект как копию объекта, переданного ему в качестве параметра.
В классе string определены три операции присваивания:
strings operator=(const string& str);
string& operator=(const char* s);
string& operator=(char c);
Строке можно присваивать другую строку типа string, строку старого стиля или отдельный символ:
string s l; string s2("Bacfl"); string s3(s2);
sl = 'X'; sl = "Вася"; s2 = s3;
Операции > >= [ ] « » += + == != < <=
Синтаксис операций и их действие очевидны. Размеры строк устанавливаются автоматически так, чтобы объект мог содержать присваиваемое ему значение. Надо отметить, что для строк типа string не соблюдается соответствие между адресом первого элемента строки и именем, как это было в случае строк старого стиля, то есть &s[0] не равно s.
Кроме операции индексации, для доступа к элементу строки определена функция at:
string s("Bacя");
cout « s. at(l); // Будет выведен символ а
Если индекс превышает длину строки, порождается исключение out_of_range.
Для работы со строками целиком этих операций достаточно, а для обработки частей строк (например, поиска подстроки, вставки в строку, удаления символов) в классе string определено множество разнообразных методов (функций).
Функции класса string можно разбить на несколько категорий: присваивание и добавление частей строк, преобразования строк, поиск подстрок, сравнение и получение характеристик строк.
1) Присваивание и добавление частей строк
1.1. Присваивание части одной строки другой - функция assign:
assign(const string& str);
assign(const string& str. size_type pos. size_type n):
assign(const char* s. size_type n);
Первая форма функции присваивает строку str вызывающей строке, при этом действие функции эквивалентно операции присваивания:
string slC'Bacfl"). s2;
s2.assign(sl); // Равносильно s2 = si:
Вторая форма присваивает вызывающей строке часть строки str, начиная с позиции pos. Если pos больше длины строки, порождается исключение out_of_range. Вызывающей строке присваивается п символов, либо, если pos + п больше, чем длина строки str, все символы до конца строки str. Третья форма присваивает вызывающей строке п символов строки s старого типа.
1.2. Добаление части одной строки к другой - функция append:
append(const string& s t r );
append(const string& str, size_type pos, size_type n);
append(const char* s, size_type n):
Первая форма функции добавляет строку str к концу вызывающей строки, действие функции эквивалентно операции конкатенации (+). Вторая форма добавляет к вызывающей строке часть строки str, начиная с позиции pos. Если pos больше длины строки, порождается исключение out_of_range. Третья форма добавляет к вызывающей строке n символов строки s старого типа.
2) Преобразования строк
2.1.Вставка в одну строку части другой строки - функция insert:
insert(size__type pos1, const string& s t r );
insert(size_type pos1, const string& str, size_type pos2, size_type n);
insert(size__type pos. const char* s. size_type n);
Первая форма функции вставляет строку str в вызывающую строку, начиная спозиции posl вызывающей строки. Если posl больше длины строки, порождается исключениеout_of_range. Если длина результата больше максимально допустимой длины строки, порождается исключение length__error.
Вторая форма функции вставляет в вызывающую строку часть строки str, начиная с позиции posl вызывающей строки. Вызывающая строка замещается строкой, которая состоит из первых posl символов вызывающей строки, за которыми следуют п элементов строки str, начиная с позиции pos2, а после них располагаются остальные символы вызывающей строки. Если п больше длины строки str, копируется весь остаток строки str. Если posl или pos2 больше длины соответствующейстроки, порождается исключение out_of_range. Если длина результата больше максимально допустимой длины строки, порождается исключение length_error.
Третья форма функции вставляет в вызывающую строку n элементов строки s старого типа, начиная с позиции pos вызывающей строки.
2.2. Удаление части строки - функция erase:
erase(size_type pos = 0, size_type n = npos):
Она удаляет из вызывающей строки п элементов, начиная с позиции pos. Если pos не указано, элементы удаляются с начала строки. Если не указано n, удаляется весь остаток строки. Величина npos является статическим членом класса string и представляет собой самое большое положительное число типа s1ze_type.
2.3. Очистка всей строки - функция clear: void clear()
2.4. Замена части строки - функция replace:
replace(size_type pos, size_type nl, const string& str):
replace(s1ze_type pos,. s1ze_type nl, const string& str, size_type pos2,size_type n2):
Здесь posl — позиция вызывающей строки, начиная с которой выполняется замена, nl — количество удаляемых элементов, pos2 — позиция строки str, начиная с которой она вставляется в вызывающую строку, п2 — количество вставляемых элементов строки str. Если posl или pos2 больше длины соответствующей строки, порождается исключение out_of_range. Если длина результата больше максимально допустимой длины строки, порождается исключение length_error.
Третья форма функции замены позволяет заменить nl символов вызывающей строки на п2 символов строки старого стиля s:
replace(size_type posl, size_type nl, const char* s, size_type n2):
2.5. Обмен содержимого двух строк - функция swap: swap(strings s);
2.6. Выделение части строки - функция substr:
string substr(size_type pos = 0, size_type n = npos) const:
Функция возвращает подстроку вызываемой строки длиной п, начиная с позиции pos. Если pos больше длины строки, порождается исключение out_of_range. Если n больше длины строки, возвращается весь остаток строки.
2.7. Преобразование объекта типа string в строки старого стиля - функция c_str:
const char* c_str() const:
Она возвращает константный указатель на оканчивающуюся нуль-символом строку. Эту строку нельзя пытаться изменить.
Аналогично работает функция data, за тем исключением, что не добавляет в конец строки нуль-символ: const char* data О const:
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |


