Клас Строка
Операция введення використовує стандартну функцію введення символьній строки. Благоразумно забезпечити, щоб присвоювання об'єкта себе працювало правильно: Конструкторы і деструкторы прості (звісно ж): 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.