Статья

Статья Класс Строка

Работа добавлена на сайт bukvasha.net: 2015-10-29

Поможем написать учебную работу

Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.

Предоплата всего

от 25%

Подписываем

договор

Выберите тип работы:

Скидка 25% при заказе до 26.11.2024



Класс Строка

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

}

Список литературы

Для подготовки данной работы были использованы материалы с сайта http://www.realcoding.net



1. Реферат Великая тайна воды
2. Реферат на тему The Middle East Essay Research Paper International
3. Реферат Універсальна овочерізальна машина МРО 400-1000
4. Сочинение на тему Евтушенко е. а. - шестидесятники
5. Реферат Информатика как единство науки и технологии
6. Доклад Школа науки управления количественная школа и ситуационная школа
7. Курсовая Пути повышения конкурентоспособности продукции на материалах РУПП МОГИЛЁВХЛЕБПРОМ
8. Реферат О физической культуре и спорте в Российской Федерации
9. Сочинение на тему Лермонтов м. ю. - Пейзажная лирика в творчестве а. с. пушкина и м. ю. лермонтова
10. Шпаргалка Шпоры по гражданскому праву 3