рефераты конспекты курсовые дипломные лекции шпоры

Реферат Курсовая Конспект

Клас string

Клас string - Конспект, раздел Образование, Конспект лекцій СИСТЕМНЕ ПРОГРАМУВАННЯ У Мові C++ Для Представлення І Обробки Рядків Є Дві Можливості. По-П...

У мові C++ для представлення і обробки рядків є дві можливості.

По-перше, можна використовувати символьний масив, що закінчується нулем і є рядком в стилі мови C, як це й робилося практично у всіх прикладах даної книги.

По-друге, для роботи з рядками можна використовувати об'єкти бібліотечного класу string з бібліотеки <string>. В цій бібліотеці ім'я string оголошено в просторі імен std і є коротким ім'ям конкретизації більш загального класу-шаблону basic_string:

 

typedef basic_string<char> string;

 

Насправді в класу basic_string є дві конкретизації класу: згаданий клас string, який підтримує рядки 8-розрядних символів, і клас wstring, який підтримує рядки широких (16-розрядних) символів. Оскільки при звичайному програмуванні частіше всього використовуються 8-розрядні символи, далі розглядатиметься тільки конкретизація string шаблонного класу basic_string.

Додавання в C++ класу string на перший погляд здається зайвим, оскільки в C++ як рядки вже підтримуються масиви символів, що закінчуються нулем. Але ці рядки не можна обробляти за допомогою стандартних операторів C++ і вони не можуть бути частиною звичайних виразів C++. Як демонстрація цього розглянемо наступний фрагмент програми:

 

char s1[80], s2[80], s3[80];

s1 = "Добрий "; // таке присвоювання не допускається

s2 = "день!"; // теж не допускається

s3 = si + s2; // помилка, знову не допускається

 

Для символьного рядка в стилі C не можна використовувати оператор “=” для присвоювання нового значення, за винятком ініціалізації, а для конкатенації двох рядків не можна використовувати оператор складання. Такі операції доводиться виконувати за допомогою показаних нижче бібліотечних функцій:

 

strcpy(s1, "Добрий ");

strcpy(s2, "день!");

strcpy(s3, s1);

strcat(s3, s2);

 

Оскільки символьні масиви, що закінчуються нулем, за своєю суттю технічно не є типами даних, до них не можна застосовувати оператори C++. Це призводить до того, що навіть самі елементарні операції з рядками стають надзвичайно заплутаними. Неможливість використання стандартних операторів C++ для роботи з символьними масивами, що закінчуються нулем, і стала основною причиною включення в стандартну бібліотеку рядкового класу.

Коли в C++ оголошується клас, для цього нового класу можна перевантажувати практично всі оператори. Таким чином, шляхом додавання до бібліотеки стандартного класу string стає можливим обробляти рядки в мові C++ таким самим чином, яким обробляються дані інших типів, а саме за допомогою операторів.

Є, проте, і ще один довід на користь використання стандартного класу string — це безпечне програмування. Недосвідчений або необережний програміст може дуже легко вийти за межі масиву, в якому зберігається рядок, що закінчується нулем.

Розглянемо, наприклад, стандартну функцію копіювання рядків strcpy(). В цій функції абсолютно відсутні які б то не було атрибути, призначені для контролю меж масиву, в який копіюється рядок. Якщо в початковому масиві опиняється більше символів, чим може поміститися в масиві, в який він копіюється, цілком можлива програмна або навіть системна помилка. Стандартний клас string запобігає самій можливості виникнення подібних помилок.

Остаточно, для включення в бібліотеку стандартного класу string є три головні причини:

сумісність, оскільки рядок стає типом даних в C++;

зручність, оскільки тепер можна використовувати стандартні оператори C++;

нарешті, безпека, оскільки межі масиву контролюються і не порушуються.

Хоча все перелічене говорить про необхідність включення в бібліотеку класу string, проте, це не є доводом на користь відмови у всіх випадках від звичайних масивів, що закінчуються нулем.

Рядки в стилі C залишаються найбільш ефективним способом реалізації символьних рядків, з чого витікає, що якщо при створенні програми швидкість виконання програми не є домінуючим чинником, новий клас string надає програмісту безпечний і повністю інтегрований в середовище програмування C++ спосіб обробки рядків.

Хоча рядковий клас традиційно не вважається частиною бібліотеки стандартних шаблонів STL (див. підрозділ 8.4), проте, він є класом-контейнером. Це, зокрема, означає, що він підтримує алгоритми бібліотеки STL. Зокрема, в класі string підтримуються функції begin() і end(), що повертають відповідно ітератор початку й кінця рядка. Також підтримується функціяsize(), що повертає поточне число символів рядка.

Окрім цього, для обробки рядків є додаткові можливості. Щоб дістати доступ до класу string, в програму слід включити директиву:

 

#include <string>

 

Оскільки клас string дуже великий і в ньому є багато конструкторів і перевантажених функцій-членів, з метою економії часу на вивчення нижче будуть описані тільки деякі, найбільш важливі| можливості цього великого класу.

8.3.1 Основні конструктори

В класі string є декілька конструкторів. Нижче представлені прототипи трьох з них, які частіше за все використовуються в програмах:

 

string();

string(const char *str);

string(const string &str);

 

В першому варіанті за допомогою конструктора створюється порожній об'єкт типу string.

В другому варіанті об'єкт типу string створюється з рядка в стилі C, що закінчується нулем, заданого вказівником на його перший символ; цей конструктор є конструктором приведення рядка, що закінчується нулем, до об'єкту типу string.

В третьому варіанті об'єкт типу string створюється з іншого об'єкту типу string, тобто цей варіант конструктора є конструктором копіювання.

8.3.2 Основні| оператори

В табл. 8.1 перелічені найбільш часто використовувані оператори, перевантажені для роботи з об'єктами типу string.

 

Таблиця 8.1

Основні оператори для роботи з рядками

Оператор Виконувана операція
= Присвоювання рядка
+ Конкатенація рядків
+= Присвоювання з конкатенацією рядків
== Перевірка на рівність рядків
!= Перевірка на нерівність рядків
< Перевірка на те, чи лівий рядок менше правого
<= Перевірка на те, чи лівий рядок менше або рівний правому
> Перевірка на те, чи лівий рядок більше правого
>= Перевірка на те, чи лівий рядок більше або рівний правому
[] Вибірка по індексу
<< Вивід рядка
>> Ввід рядка

 

Перелічені в таблиці оператори дозволяють використовувати об'єкти string в звичайних виразах і дають можливість відмовитися від викликів спеціалізованих функцій, наприклад, функцій strcpy() або strcat(). Як правило, об'єкти типу string у виразах можна записувати разом із звичайними рядками, що закінчуються нулем. Наприклад, об'єкт типу string можна присвоїти рядку, що закінчується нулем.

Оператор + можна використовувати для конкатенації об'єкту типу string з іншим об'єктом типу string або для конкатенації об'єкту типу string з рядком в стилі С. Підтримуються наступні комбінації операндів:

 

string + string

string + C-string

C-string + string

 

Окрім цього, оператор + можна використовувати для приєднання одиночного символу в кінець рядка.

Нижче наведений короткий приклад використання рядкового класу:

 

#include <iostream>

#include <string>

using namespace std;

int main()

{

string str1("Добридень ");

string str2("мир!");

string str3;

// присвоювання рядків

str3 = str1;

cout << str1 << "n" << str3 << "n";

// конкатенація двох рядків

str3 = strl + str2;

cout << str3 << "n";

// порівняння рядків

if(str3 > str1)

cout << "str3 > str1n";

if(str3 == str1+ str2)

cout << "str3 == str1+ str2n";

// рядковому об'єкту можна присвоїти звичайний рядок

str1 = "Це звичайний рядок n";

cout << str1;

// створення рядкового об'єкту за допомогою іншого

// рядкового об'єкту

string str4(str1);

cout << str4;

// ввід рядка

cout << "Введіть рядок: ";

cin >> str4;

cout << str4;

return 0;

}

 

Після виконання програми на екрані з'явиться наступне:

 

Добридень

Добридень

Добридень, мир!

str3 > str1

str3 == str1 + str2

Це звичайний рядок

Це звичайний рядок

Введіть рядок: Привіт

Привіт

 

З програми видно, що з об'єктами типу string можна поводитися так само, як і з вбудованими типами даних мови C++. Це фактично і є головне достоїнство рядкового класу.

 

8.4 STL - стандартна бібліотека шаблонів мови C++

Стандартна бібліотека шаблонів STL (Standard Template Library) включає набір різноманітних контейнерів, які параметризуються, ітератори та багато узагальнених алгоритмів.

– Конец работы –

Эта тема принадлежит разделу:

Конспект лекцій СИСТЕМНЕ ПРОГРАМУВАННЯ

Конспект лекцій... по дисциплiні СИСТЕМНЕ ПРОГРАМУВАННЯ...

Если Вам нужно дополнительный материал на эту тему, или Вы не нашли то, что искали, рекомендуем воспользоваться поиском по нашей базе работ: Клас string

Что будем делать с полученным материалом:

Если этот материал оказался полезным ля Вас, Вы можете сохранить его на свою страничку в социальных сетях:

Все темы данного раздела:

РОБОТА З ДАНИМИ
Якість організації і представлення даних, що обробляються програмами, має не менше значення, ніж хороше розбиття програм на функції, обробляючі ці дані, та реалізація алгоритмів цих функцій. Більш

Оголошення
В мові С++ кожне ім'я (ідентифікатор) слід оголосити перш, ніж воно буде використовуватися в програмі. Це означає, що потрібно вказати його тип, щоб компілятор знав, до якого виду об'єктів має відн

Синтаксис оголошення
Оголошення складається з чотирьох частин: необов'язкових одного або декількох специфікаторів, базового типу, частки оголошення і, можливо, ініціалізатора. За винятком визначень функцій і просторів

Посилання
Посилання (reference) – особливий тип даних, що є прихованою формою вказівника, який при зверненні автоматично розіменовується. Посилання можна розглядати як ще одне ім'я об'єкту. Посиланн

Типи даних користувача
Описані раніше вбудовані типи даних мови C++ можуть бути доповнені новими типами даних, визначеними самим користувачем. Типи даних користувача діляться на три групи: переліки, структури й об'єднанн

Структури мови C
Масив є сукупністю елементів одного типу, а структура є сукупністю елементів різних типів. Оголошення структури має наступний формат:   struct struct_name {

Оголошення typedef
Оголошення, що починається з ключового слова typedef, вводить нове ім'я (синонім) для типу, а не оголошує нову змінну цього типу. Формат оголошення typedef наступний:   typed

Масиви як аргументи
Якщо в якості аргументу функції задається масив, то передається вказівник на його перший елемент. Наприклад:   int strlen(const char*); void f() {

Аргументи за умовчанням
У функції загального призначення можуть бути більше аргументів, ніж це потрібно в найпростіших і найбільш часто використовуваних випадках. Зокрема, це властиво функціям, що будують об'єкти по запит

Макрос WINAPI
Оскільки компілятор Visual C++ більше не підтримує ключових слів __pascal, __fortran та __syscall, їх дію рекомендується емулювати за допомогою описаних вище ключових слів __cdecl, __stdcall або __

ПРОГРАМУВАННЯ ВИКЛЮЧЕНЬ
Виключною ситуацією, або виключенням (exception), називається переривання нормального потоку виконання програми у відповідь на непередбачену або аварійну подію. Події, що приводять до викл

Виключення Win32
Разом з програмними викликами виключень за допомогою інструкції throw, виключення генеруються системними програмами Win32 API у відповідь на збій апаратного або програмного забезпечення. Такі виклю

Обробка виключень Win32
Існує декілька способів обробки виключень Win32. Найбільш простий з них полягає в використанні блоку catch з трьома крапками:   try { // … // генер

МОДУЛЬНЕ ПРОГРАМУВАННЯ
Набір зв'язаних процедур разом з даними, які вони обробляють, називається модулем. Модуль – програмний фрагмент, який є будівельним блоком для побудови великих програм. Як правило, модуль складаєть

Директиви препроцесора
Існує 14 стандартних директив препроцесора:   #include #define #undef #if #ifdef #ifndef #elif #else #

Макроси
Директива #define для оголошення макросів має дві синтаксичні форми:   #define ідентифікатор макроозначення #define ідентифікатор (список параметрів) макроозначення

Конструктори
Раніше наведене оголошення класу CFrame дозволяє ініціалізувати змінні-члени об'єктів класу шляхом виклику програмою користувача функції-члена класу SetCoord(). В якості іншого, стандартно

Конструктори за умовчанням
Конструктор без аргументів називають конструктором за умовчанням. Такий конструктор звичайно ініціалізує змінні-члени, присвоюючи їм стандартні, встановлювані за умовчанням значення. Наприклад, нас

Деструктори
Відповідно до принципів об'єктно-орієнтованого програмування| в класі можна оголосити спеціальну функцію-член|, звану деструктором. Деструктор автоматично викликається кожного разу при зни

Правила спадкування
Спадкування, тобто породження одного класу з іншого, дозволяє повторно використовувати коди й структури даних, раніше створені для інших класів. Це робить програму зрозумілішою і допомагає в моделю

Переваги спадкування
Як випливає з приведених вище простих прикладів, спадкування дозволяє повторно використовувати створені раніше фрагменти програм і структури даних. Це дозволяє уникнути непотрібного дублювання прог

Конструктори приведення
Конструктор приведення класу — це конструктор з єдиним аргументом, тип якого відрізняється від типу класу. Такий конструктор звичайно ініціалізує новий об'єкт, використовуючи літерали, або дані змі

УЗАГАЛЬНЕНЕ ПРОГРАМУВАННЯ
Узагальнене програмування з використанням шаблонів мови C++ полегшує генерацію сімейств функцій або класів, що оперують множинами даних різних типів. При цьому не виникає необхідності створювати ок

Контейнери
Перед тим, як дати загальне визначення контейнера, спочатку як приклад сконструюємо простий контейнер на базі розглянутого раніше стека символів. Ми можемо узагальнити стек символів до сте

Потоки вводу - виводу
Як вже мовилося раніше, якщо програма на мові C починає виконуватися, автоматично відкриваються три потоки: stdin, stdout і stderr.Щось схоже має місце при завантаженні програми, написаної на мові

Класи потокового вводу - виводу
У C++ ввід - вивід забезпечується підключенням до програми заголовного файлу <iostream>. Саме в цьому файлі оголошені класи, що підтримують операції вводу – виводу. Система вводу – в

Прапори формату
Кожен потік вводу - виводу пов'язаний з набором прапорів формату (format flags), які управляють способом форматування інформації і є бітовими масками. Ці маски оголошені в класі ios як дані перелік

Закриття файлу
Для закриття файлу використовується функція-член| close(). Наприклад, щоб закрити файл, пов'язаний з потоком mystream, необхідна наступна інструкція:   mystream.close ();

Контроль стану вводу - виводу
В системі вводу - виводу C++ підтримується інформація про стан після кожної операції вводу - виводу. Поточний стан потоку вводу - виводу, який зберігається в об'єкті типу iostate, є переліком, визн

Атрибути
Атрибути є позначками, що використовуються програмістом для передачі декларативної інформації. Приймачем інформації може бути інструментальне середовище, програма-конструктор, аналізатор програмног

Мова програмування Visual Basic .NET
Хоча мови програмування керований C++, С# та Visual Basic .NET (VB) семантично мають практично однакові можливості, оскільки всі вони базуються на загальній специфікації мов програмування .NET (CLS

Цикл For
В мові С++ цикл for має дещо інший синтаксис, ніж цикл For в мові VB, але концепція залишається тою ж самою, якщо не зважати на те, що операція, яка виконується в кінці кожної ітерації, має бути вк

Хотите получать на электронную почту самые свежие новости?
Education Insider Sample
Подпишитесь на Нашу рассылку
Наша политика приватности обеспечивает 100% безопасность и анонимность Ваших E-Mail
Реклама
Соответствующий теме материал
  • Похожее
  • Популярное
  • Облако тегов
  • Здесь
  • Временно
  • Пусто
Теги