Referat.me

Название: Класс Строка

Вид работы: статья

Рубрика: Информатика и программирование

Размер файла: 14.2 Kb

Скачать файл: referat.me-140476.docx

Краткое описание работы: Вот довольно реалистичный пример класса string. В нем производится учет ссылок на строку с целью минимизировать копирование и в качестве констант применяются стандартные символьные строки C++.

Класс Строка

Вот довольно реалистичный пример класса string. В нем производится учет ссылок на строку с целью минимизировать копирование и в качестве констант применяются стандартные символьные строки C++.

#include

#include

class 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";

exit(1);

}

char& string::operator[](int i)

{

if (i<0 || strlen(p->s)s[i];

}

Головная программа просто немного опробует действия над строками. Она читает слова со ввода в строки, а потом эти строки печатает. Она продолжает это делать до тех пор, пока не распознает строку done, которая завершает сохранение слов в строках, или не встретит конец файла. После этого она печатает строки в обратном порядке и завершается.

main()

{

string x[100];

int n;

cout << "отсюданачнемn";

for (n = 0; cin>>x[n]; n++) {

string y;

if (n==100) error("слишкоммногострок");

cout << (y = x[n]);

if (y=="done") break;

}

cout << "отсюда мы пройдем обратноn";

for (int i=n-1; 0<=i; i--) cout << x[i];

}

Похожие работы

  • Присваивание и Инициализация

    Строка - это структура данных, состоящая из вектора символов и длины этого вектора. Вектор создается конструктором и уничтожается деструктором. Однако это может привести к неприятностям.

  • Выражения и Операторы

    Выражения. Операторы Выражения. Пустой оператор. Блоки. Операторы if. Операторы switch. Оператор while. Оператор for. Описания.

  • Для чего нужна процедура Sub?

    Sub это то же самое, что и Function, только она не возвращает значение, а производит какое-нибудь действие. Например вывод на экран сообщения или манипулирование несколькими свойствами.

  • Работа с текстовыми файлами в Visual Basic

    Открытие файла для чтения информации из него. Открытие файла для записи информации в него.

  • Лабараторная работа №4

    Цель работы: изучение правил записи констант, переменных, выражений, операторов присваивания, раздела определения констант, раздела описания переменных и общей структуры программы на языке Turbo-Pascal.

  • Билеты по информатике 10 класс: Visual Basic

    Билет №2 Do While L } S выполняется S }если L-истина Loop } Do }S выполняется S }пока L-истина Loop While L } Do }S выполняется S }вечно, пока не [exit do] } будет перехода

  • 10 задач с решениями программированием на Паскале

    Задача 1. Условие: Найти среднее арифметическое общей совокупности элементов тех строк заданной матрицы, последний элемент которых равен 1. Программа:

  • Строковый тип данных в языке Pascal

    Ознакомимся с типом данных, который относится к числу структурированных. Это строковый тип данных (строка). Строка — это последовательность символов. Каждый символ занимает 1 байт памяти (код ASCII).

  • Организация ввода-вывода. Обработка массивов. Структурированные данные

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

  • Алгоритмические языки: обработка массивов

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