Термінова допомога студентам
Дипломи, курсові, реферати, контрольні...

Клас Строка

РефератДопомога в написанніДізнатися вартістьмоєї роботи

Операция введення використовує стандартну функцію введення символьній строки. Благоразумно забезпечити, щоб присвоювання об'єкта себе працювало правильно: Конструкторы і деструкторы прості (звісно ж): If (n==100) error («занадто багато рядків «); Cout <<«звідси ми пройдемо обратноn »; Char* p. s; // покажчик на данные. If (p->n > 1) { // роз'єднати себя. Ostream& operator<<(ostream& p. s… Читати ще >

Клас Строка (реферат, курсова, диплом, контрольна)

Класс Строка

Вот досить реалістичний приклад класу string. У ньому виробляється облік посилань на рядок з єдиною метою мінімізувати копіювання й у ролі констант застосовуються стандартні символьні рядки З++.

#include.

#include.

class string {.

struct srep {.

char* p. 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, p. 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, p. 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& p. s, string& x).

{.

return p. s << x. p->s << «[ «<< x. p->n << «]n » ;

}.

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

istream& operator>>(istream& p. 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; і—) cout << x[i];

}.

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

Для підготовки даної роботи було використані матеріали із російського сайту internet.

Показати весь текст
Заповнити форму поточною роботою