Урок №209. Створення, знищення і конвертація std::string

  Юрій  | 

  Оновл. 8 Жов 2021  | 

 122

На цьому уроці ми розглянемо, як створюються об’єкти std::string в мові С++, а також створення рядків з чисел (і навпаки).

Створення std::string

Рядкові класи мають ряд конструкторів і деструктор, які можна використовувати для створення рядків. Ми розглянемо кожен з них.

string::string()

   Конструктор за замовчуванням, який створює пустий рядок.

Наприклад:

Результат:

 

string::string(const string& strString)

   Конструктор копіювання, який створює новий рядок шляхом копіювання strString.

Наприклад:

Результат:

What a string!

string::string(const string& strString, size_type unIndex)
string::string(const string& strString, size_type unIndex, size_type unLength)

   Конструктори, які створюють нові рядки, які складаються з рядка strString (починаючи з індексу unIndex) і кількості символів, вказаної в unLength.

   Якщо компілятор зустрічає NULL, то копіювання рядка завершується, навіть якщо unLength не був досягнутий.

   Якщо unLength не був вказаний, то всі символи, починаючи з unIndex, будуть використані.

   Якщо unIndex більший за розмір рядка, то генерується виняток out_of_range.

Наприклад:

Результат:

t a string
a stri

string::string(const char *szCString)

   Конструктор, який створює новий рядок з переданого рядка C-style szCString аж до нуль-термінатора (але його не включає). Якщо розмір результату перевищує максимальну довжину рядка, то генерується виняток length_error.

Попередження: szCString не повинен бути NULL.

Наприклад:

Результат:

What a string!

string::string(const char *szCString, size_type unLength)

   Конструктор, який створює новий рядок з рядка C-style szCString з кількістю символів, вказаною в unLength.

   Якщо розмір результату перевищує максимальну довжину рядка, то генерується виняток length_error.

Попередження: Тільки для цього конструктора значення NULL не обробляється як об’єкт, який вказує на завершення рядка szCString! Це означає, що компілятор дійде до кінця рядка (якщо це дозволяє unLength), навіть якщо зустріне NULL.

Наприклад:

Результат:

What a

string::string(size_type nNum, char chChar)

   Конструктор, який створює новий рядок, який ініціалізований символом chChar і необхідною кількістю входжень цього символу (вказується в nNum).

   Якщо розмір результату перевищує максимальну довжину рядка, то генерується виняток length_error.

Наприклад:

Результат:

GGGGG

template string::string(InputIterator itBeg, InputIterator itEnd)

   Конструктор, який створює новий рядок, який ініціалізований символами з діапазону [itBeg, itEnd).

   Якщо розмір результату перевищує максимальну довжину рядка, то генерується виняток length_error.

Тут немає прикладу, тому що ймовірність того, що ви будете використовувати цей конструктор, мізерна.

string::~string()

   Деструктор, який знищує рядок і звільняє пам’ять.

Прикладу немає, тому що деструктор викликається неявно.

Створення std::string з чисел

Одне помітне упущення в класі std::string — це відсутність можливості створювати рядки з чисел. Наприклад:

Тут ми отримаємо помилку невдалої конвертації значення типу int в std::basic_string. Найпростіший спосіб конвертувати числа в рядки — це задіяти клас std::ostringstream, який знаходиться в заголовку sstream. std::ostringstream вже налаштований для прийому різних вхідних даних: символів, чисел, рядків тощо. А за допомогою std::istringstream можна виконувати зворотну конвертацію — виводити рядки (або через оператор виводу >>, або через функцію str()).

Наприклад, створимо std::string з різних вхідних даних:

Результат:

5
7.8
B

Зверніть увагу, тут відсутня перевірка на помилки. Може трапитися так, що конвертація tX в std::string буде невдалою. В такому випадку, хорошим варіантом було б підключити генерацію винятку.

Конвертація std::string в числа

Аналогічно вищенаведеному рішенню:

Результат:

4.5

Зверніть увагу, наша друга конвертація зазнала невдачі, і ми отримали false.

Оцінити статтю:

1 Зірка2 Зірки3 Зірки4 Зірки5 Зірок (1 оцінок, середня: 5,00 з 5)
Loading...

Залишити відповідь

Ваш E-mail не буде опублікований. Обов'язкові поля відмічені *