Студенческий сайт КФУ - ex ТНУ » Учебный раздел » Учебные файлы »Информатика

Класс Строка

Тип: статья
Категория: Информатика
Скачать
Купить
Класс СтрокаВот довольно реалистичный пример класса string. В нем производится учет ссылок на строку с целью минимизировать копирование и в качестве констант применяются стандартные символьные строки C++. #include#includeclass string { struct srep { char* s; // указатель на данные int n; // счетчик ссылок}; srep *p;public: string(char *); // string x = "abc" string(); // string x; string(string &); // string x = string ... string& operator=(char *); string& operator=(string &); ~string(); char& operator[](int i); friend ostream& operator<<(ostream&, string&); friend istream& operator>>(istream&, string&); friend int operator==(string& x, char* s) {return strcmp(x.p->s, s) == 0; } friend int operator==(string& x, string& y) {return strcmp(x.p->s, y.p->s) == 0; } friend int operator!=(string& x, char* s) {return strcmp(x.p->s, s) != 0; } friend int operator!=(string& x, string& y) {return strcmp(x.p->s, y.p->s) != 0; }};Конструкторы и деструкторы просты (как обычно): string::string(){ p = new srep; p->s = 0; p->n = 1;}string::string(char* s){ p = new srep; p->s = new char[ strlen(s)+1 ]; strcpy(p->s, s); p->n = 1;}string::string(string& x){ x.p->n++; p = x.p;}string::~string(){ if (--p->n == 0) { delete p->s; delete p; }}Как обычно, операции присваивания очень похожи на конструкторы. Они должны обрабатывать очистку своего первого (левого) операнда: string& string::operator=(char* s){ if (p->n > 1) { // разъединить себя p-n--; p = new srep; } else if (p->n == 1) delete p->s; p->s = new char[ strlen(s)+1 ]; strcpy(p->s, s); p->n = 1; return *this;}Благоразумно обеспечить, чтобы присваивание объекта самому себе работало правильно: string& string::operator=(string& x){ x.p->n++; if (--p->n == 0) { delete p->s; delete p; } p = x.p; return *this;}Операция вывода задумана так, чтобы продемонстрировать применение учета ссылок. Она повторяет каждую вводимую строку (с помощью операции <<, которая определяется позднее): ostream& operator<<(ostream& s, string& x){ return s << x.p->s << " [" << x.p->n << "]\n";}Операция ввода использует стандартную функцию ввода символьной строки.istream& operator>>(istream& s, string& x){char buf[256];s >> buf;x = buf;cout << "echo: " << x << "\n";return s;}Для доступа к отдельным символам предоставлена операция индексирования. Осуществляется проверка индекса: void error(char* p){ cerr << p << "\n";
Другие файлы:

Создание иерархии классов
Описание классов данных. Основное меню программы. Добавление и удаление объектов. Вывод устройств хранения в указанном ПК. Устройство хранения, класс...

Готовые домашние задания. Уроки на дом 5-11 классы
"Алгебра 5 класс", Валенкин Н.Я."Алгебра 6 класс", Валенкин Н.Я."Русский язык 5 класс", Разумовская Н.Н."Русский язык 6 класс", Разумовская Н.Н."Русск...

Компакт диск к книге "CodeVisionAVR. Пособие для начинающих"
Содержание Глава 1. Инсталляция и запуск CODEVISIONAVR — 10 1.1. Инсталляция CodeVisionAVR — 10 1.2. Запуск CodeVisionAVR — 16 Глава 2...

Упражнения в определении склонений имен существительных
Оборудование: картина "Лес зимой", таблицы-опоры, карточки со словами, иллюстрации снежинок, животных, офтальмотренажер, грамзапись.- Сегодня на уроке...

Балансовый способ в анализе хозяйственной деятельности
Анализ по балансу, подвергнутому дополнительной корректировке на индекс инфляции с последующим агрегированием статей в необходимых аналитических разре...