Статья

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

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

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

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

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

от 25%

Подписываем

договор

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

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



Класс Строка

Вот довольно реалистичный пример класса 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 Great Gastby Essay Research Paper F
3. Реферат на тему Assisted Suicide Essay Research Paper Assisted SuicidePhysicianassisted
4. Реферат на тему Araby Essay Research Paper The short story
5. Реферат Приспособление к жизни молодых людей из поселений различных типов
6. Реферат на тему Analysing War Poetry Essay Research Paper Comparing
7. Реферат Правовая защита информации
8. Реферат на тему Egypt Essay Research Paper As Egypt grew
9. Доклад на тему Почему большинство международных сделок заканчивается плачевно
10. Реферат на тему Безпека праці технологічних процесів РЕА