Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Не підтверджено.doc
Скачиваний:
0
Добавлен:
07.01.2020
Размер:
3.08 Mб
Скачать
  1. Конкатенація та присвоєння класу рядків з рядками, що закінчуються нульовим символом

Потрібно мати на увазі, що оператори присвоєння "=" і конкатенації "+" виз­начено тільки для об'єктів типу strClass. Наприклад, наведена нижче настанова не працездатна, оскільки вона є спробою присвоїти об'єкту ObjA рядок, який завер­шується нульовим символом:

ObjA = "Цього поки що робити не можна.";

Але клас strClass, як буде показано далі, можна удосконалити і дати йому змо­гу виконувати такі настанови.

Для розширення переліку операцій, підтримуваних класом strClass(HanpHKi^, щоб можна було об'єктам типу strClass присвоювати рядки з завершальним нуль- символом, або конкатенувати рядок, який завершується нульовим символом, з об'єктом типу strClass), необхідно перевизначити оператори "=" і "+" ще раз. Спо­чатку змінимо оголошення класу:

// Перевизначення рядкового класу: остаточний варіант class strClass { // Оголошення класового типу char string[80]; public:

class strClass { // Оголошення класового типу char string[80]; public:

strClass(char *str = "") {strcpy(string, str);}

// Конкатенація об'єктів типу strClass strClass operator+(strClass obj);

// Конкатенація об'єкта з рядком, що завершується нулем strClass operator+(char*str);

// Присвоєння одного об'єкта типу strClass іншому strClass ореrator= (strClass obj);

// Присвоєння рядка, що завершується нулем, об'єкту типу strClass

strClass о ре rato r= h a r *str);

Void Show(char*s) {cout« s « string « endl;}

};

Потім реалізуємо перевизначення операторних функцій operator+0 і operator=():

// Присвоєння рядка об'єкту типу strClass, що завершується нулем strClass strClass::operator=(char *str)

{

strClass tmp; // Створення тимчасового об'єкта

strcpy(string, str); strcpy(tmp.string, string);

return tmp; // Повертає модифікований тимчасовий об'єкт

}

// Конкатенація рядка з об'єктом типу strClass, що завершується нулем strClass strClass::operator+(char *str)

{

strClass tmp; // Створення тимчасового об'єкта

strcpy(tmp.string, string); strcat(tmp. string, str);

return tmp; // Повертає модифікований тимчасовий об'єкт

Уважно проаналізуйте коди цих функцій. Зверніть увагу на те, що правий ар­гумент є не об'єктом типу strClass, а покажчиком на символьний масив, який завер­шується нулем, тобто звичайним С++-рядком. Але обидві ці функції повертають об'єкт типу strClass. І хоча теоретично вони могли б повертати об'єкт будь-якого іншого типу, весь сенс їх існування і полягає у тому, щоб повертати об'єкт типу strClass, оскільки результати цих операцій приймаються також об'єктами типу strClass. Перевага визначення рядкової операції, у якій як правий операнд бере участь рядок, який завершується нульовим символом, полягає у тому, що воно дає змогу писати деякі настанови в природній формі. Наприклад, наведені нижче нас­танови є цілком законними: strClass а, Ь, с;

а = "Привіт усім"; // Присвоєння рядка, який завершує нулем, об'єкту с = а + "Георгій"; // Конкатенація обєкга з радком, що завершується нулем

Наведений нижче код програми містить додаткові визначення операторів присвоєння "=" і конкатенації"+".

Код програми 4.14. Демонстрація механізму конкатенації та присвоєння класу рядків з рядками, що закінчуються нульовим символом

#include <vcl>

#include <iostream> // Для потокового введення-виведення

#include <conio> // Для консольного режиму роботи

using namespace std; // Використання стандартного простору імен

class strClass { // Оголошення класового типу char string[80]; public:

strClass(char *str = "") {strcpy(string, str);}

// Конкатенація об'єктів типу strClass strClass operator+(strClass obj);

// Конкатенація об'єкта з рядком, що завершується нулем strClass operator+(char*str);

// Присвоєння одного об'єкта типу strClass іншому strClass оре rat о r= (str СI ass obj);

// Присвоєння рядка об'єкту типу strClass, що завершується нулем

strClass operator=(char*str);