Введение в язык Си++

         

Класс Строка


Вот довольно реалистичный пример класса 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(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 operators n

Операция ввода использует стандартную функцию ввода символьной строки ().

istream operator(istream s, string x) { char buf[256]; s buf; x = buf; cout

Для доступа к отдельным символам предоставлена операция индексирования. Осуществляется проверка индекса:

void error(char* p) { cerr s)s[i]; }

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

main() { string x[100]; int n;

cout x[n]; n++) { string y; if (n==100) error("слишком много строк"); cout



Содержание раздела