Перевантаження операторів в мові С++
Розробити власний клас MyString, який є аналогом до вбудованого в ядро мови C++ класу String. Реалізувати перевантаження основних операторів у власному класі, а саме:
1) Оператор додавання двох об’єктів MyString. Додавання нових рядків до вже існуючих об’єктів класу реалізувати в 2 форматах: додавання рядка у вигляді символьного масиву char, та додавання рядка у вигляді типу даних string.
2) Оператор віднімання для об’єктів MyString. Оператор віднімання повинен видаляти слова з вже існуючого рядка об’єкта MyString. Реалізувати також у 2 форматах.
3) Оператор множення повинен збільшувати рядок об’єкта на вказану з клавіатури кількість раз.
4) Оператор порівняння повинен порівнювати між собою рядки 2-ох об’єктів MyString і виводити повідомлення або рядки однакові або різні.
5) Перевантажити оператори вводу >> та виводу << для об’єктів MyString.
6) Перевантажити оператор індексування [] для доступу до будь-якого символу з рядка об’єкта MyString.
7) Перевантажити оператор приведення до типу string, щоб можна було записувати значення об’єктів MyString в змінні типу string.
В якості полів класу MyString використовувати тип даних string ЗАБОРОНЕНО! Лише статичні або динамічні символьні масиви char!
Приклад інтерфейсу класу MyString та виконання завдання приведений на малюнках.
Answers & Comments
#include
class MyString
{
char *str;
int size;
public:
MyString() : str(nullptr), size(0) {}
MyString(const char *s)
{
size = strlen(s);
str = new char[size + 1];
strcpy(str, s);
}
MyString(const std::string &s)
{
size = s.length();
str = new char[size + 1];
strcpy(str, s.c_str());
}
MyString(const MyString &s)
{
size = s.size;
str = new char[size + 1];
strcpy(str, s.str);
}
~MyString() { delete[] str; }
MyString operator+(const MyString &s) const
{
MyString temp;
temp.size = size + s.size;
temp.str = new char[temp.size + 1];
strcpy(temp.str, str);
strcat(temp.str, s.str);
return temp;
}
MyString operator+(const char *s) const
{
MyString temp;
temp.size = size + strlen(s);
temp.str = new char[temp.size + 1];
strcpy(temp.str, str);
strcat(temp.str, s);
return temp;
}
MyString operator+(const std::string &s) const
{
MyString temp;
temp.size = size + s.length();
temp.str = new char[temp.size + 1];
strcpy(temp.str, str);
strcat(temp.str, s.c_str());
return temp;
}
MyString operator-(const char *s) const
{
MyString temp = *this;
char *p = strstr(temp.str, s);
if (p)
{
int pos = p - temp.str;
memmove(p, p + strlen(s), strlen(p + strlen(s)) + 1);
temp.size = strlen(temp.str);
}
return temp;
}
MyString operator-(const std::string &s) const
{
return operator-(s.c_str());
}
MyString operator*(int n) const
{
MyString temp;
temp.size = size * n;
temp.str = new char[temp.size + 1];
temp.str[0] = '\0';
for (int i = 0; i < n; i++)
strcat(temp.str, str);
return temp;
}
bool operator==(const MyString &s) const
{
return strcmp(str, s.str) == 0;
}
bool operator!=(const MyString &s) const
{
return strcmp(str,