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