Главная » Статьи » Програмування » C++ [ Добавить статью ]

RUS Уроки по программированию на языке С++ (Пример класса СТРОКА с перегруженными операторами.)

Пример класса СТРОКА с перегруженными операторами.

Теперь, на основании полученных знаний дополним класс СТРОКА, описанный в уроке. А, именно - добавим в него функцию сцепления строк, используя перегрузку бинарного оператора +, перегрузим операцию присваивания и создадим возможность преобразования строки к нашему объекту.

#include <iostream>
#include <string.h>

using namespace std;

class string_ 
{
private:
 // Строка
 char* S;

 // Длина строки
 int len; 
public:
 // Конструктор по умолчанию
 // без параметров
 string_();

 // Перегруженный конструктор
 // с параметром
 string_(char* s); 
 
 // Конструктор копирования
 string_(const string_& s); 
 
 // Деструктор
 ~string_(){ 
 delete [] S;
 } 

 // Метод сортировки
 void Sort(string_ s[], int n); 

 // Константный метод
 // возвращающий содержимое
 // строки
 const char*GetStr()const 
 { 
 return S; 
 }
 // метод позволяющий изменить содержимое
 // с помощью пользователя
 void SetStr() 
 {
 // если строка не пустая - очистить
 if(S!=NULL)
 delete[]S;
 
 // создаем массив
 // и запрашиваем у пользователя данные
 char a[256]; 
 cin.getline(a,256); 

 // просчитываем размер
 len=strlen(a)+1;

 // выделяем память
 S = new char[len];

 // переписываем в объект
 // введенную строку
 strcpy(S,a); 
 }

 // Перегрузка бинарного оператора
 // Первый параметр передается неявно с помощью указателя this
 // Функция реализует сцепление строк
 string_ operator+(const string_&); 

 // Перегрузка бинарного оператора
 // Первый параметр передается неявно с помощью указателя this
 // Функция реализует корректное присваивание объектов друг другу
 // в ситуации объект1=объект2. Напоминаем, эта ситуация является
 // четвертым случаем побитового копирования, при котором
 // конструктор копирования - бессилен.
 string_&operator=(const string_&);

 // Перегрузка типа
 // Функция реализует преобразование объекта класса к типу char*
 operator char*() { return S; }
};

string_::string_()
{
 // Начальная инициализация
 S = NULL; 
 len = 0;
}

string_::string_(char* s)
{
 len = strlen(s);
 S = new char[len + 1];
 // Инициализация строкой,
 // переданной пользователем
 strcpy(S, s); 
}

string_::string_(const string_& s)
{
 len = s.len;
 // Безопасное копирование
 S = new char[len + 1]; 
 strcpy(S, s.S);
}

void string_::Sort(string_ s[], int n)
{ 
 // Сортировка строк
 // Методом пузырька
 
 string_ temp; 

 for(int i=0;i<n-1;i++) 
 {
 for(int j=n-1;j>i;j--)
 {
 // сравнение двух строк
 if(strcmp(s[j].S,s[j-1].S)<0)
 {
 // теперь, когда у нас есть
 // перегруженный оператор равно
 // мы не нуждаемся в дополнительной
 // функции SetStr2, которую использовали
 // в прошлом примере для присваивания

 // запись стороки s[j] в temp
 temp=s[j];

 // запись стороки s[j-1] в s[j]
 s[j]=s[j-1];

 // запись стороки temp в s[j-1]
 s[j-1]=temp; 
 }
 }
 }
}

// Функция сцепления строк (перегруженный
// бинарный плюс)
string_ string_::operator+(const string_ &str)
{ 
 // Создание временного объекта 
 string_ s;
 
 // Вычисление новой длины строки
 s.len = len + str.len; 

 // Выделение памяти под новую строку
 s.S = new char[s.len + 1];

 // Инициализация первой части строки
 strcpy(s.S, S);

 // Инициализация второй части строки 
 strcat(s.S, str.S);
 
 // Возврат нового объекта 
 return s; 
}

// Функция, реализующая безопасное присваивание
string_& string_::operator=(const string_ &str)
{ 
 // Предотвращение варианта STRING = STRING; 
 // (присваивание самому себе),
 // где STRING переменная класса string 
 if(this == &str) 
 return *this;
 
 // если размеры строк не совпадают
 // или строка, в которою производится запись
 // не сформированна
 if(len != str.len || len == 0)
 {
 // Удаление старой строки
 delete [] S;
 // Вычисление новой длины строки 
 len = str.len;
 // Выделение памяти под новую строку 
 S = new char[len + 1]; 
 }

 // Инициализация строки
 strcpy(S, str.S);

 // Возврат ссылки на "самого себя"
 // Благодаря этому возможно многократное
 // присваивание объектов друг другу
 // например, string_ a, b, c; a = b = c; 
 return *this; 
}


void main()
{
 int n,i;

 // Вводим количество строк
 cout << "Input the number of string s:\t";
 cin >> n; 

 if(n < 0)
 {
 cout << "Error number:\t" << n << endl;
 return;
 }

 // Забираем из потока символ Enter ("\n")
 char c[2]; 
 cin.getline(c, 2);

 // Создаем массив из n строк
 string_ *s = new string_[n]; 

 // Ввод строк c клавиатуры
 for(i = 0; i < n; i++)
 s[i].SetStr(); 

 // Сортировка строк
 // Вызов через указатель,
 // так как функция работает
 // для группы объектов,
 // а не для одного конкретного
 s->Sort(s, n); 

 // Вывод отсортированных строк
 for(i = 0; i < n; i++)
 cout<<"\n"<<s[i].GetStr()<<"\n"; 

 // Удаление массива строк
 delete [] s; 

 cout<<"\n\n+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n\n";

 //Проверяем на деле оператор + и преобразование

 string_ A,B,C,RES;

 A="Ivanov ";
 B="Ivan ";
 C="Ivanovich";
 RES=A+B+C;
 cout<<RES.GetStr()<<"\n\n";
}
Категория: C++ | Добавил: DEN-SHP (06.11.2012)
Просмотров: 1189 | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]