Партнерка на США и Канаду по недвижимости, выплаты в крипто

  • 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