Категория
Информатика
Тип
реферат
Страницы
3 стр.
Дата
04.01.2008
Формат файла
.rtf — Rich Text Format (Wordpad)
Архив
20813.zip — 4.59 kb
  • prisvaivanie-i-inicializacija_20813_1.rtf — 20.89 Kb
  • Readme_docus.me.txt — 125 Bytes
Рейтинг
10  из 10
Оценок
1
Оцените работу
Хорошо  или  Плохо


Текст работы

Присваивание и Инициализация Alena Alena
Присваивание и Инициализация
Рассмотрим очень простой класс строк string:
struct string
char* p;
int size; // размер вектора, на который указывает p
string(int sz) p = new char[size=sz];
~string() delete p;
;
Строка - это структура данных, состоящая из вектора символов и длины этого вектора. Вектор создается конструктором и уничтожается деструктором. Однако это может привести к неприятностям.
Например :
void f()
string s1(10);
string s2(20);
s1 = s2;
будет размещать два вектора символов, а присваивание s1=s2 будет портить указатель на один из них и дублировать другой. На выходе
из f() для s1 и s2 будет вызываться деструктор и уничтожать один и тот же вектор
с непредсказуемо разрушительными последствиями. Решение этой проблемы состоит в том, чтобы соответствующим образом определить присваивание
объектов типа string:
struct string
char* p;
int size; // размер вектора, на который указывает p
string(int sz) p = new char[size=sz];
~string() delete p;
void operator=(string&);
void string::operator=(string& a)
if (this == &a) return; // остерегаться s=s;
delete p;
p=new char[size=ze];
strcpy(p,a.p);
Это определение string гарантирует, и что предыдущий пример будет работать как предполагалось. Однако небольшое изменение f() приведет к появлению той же проблемы в новом облике:
void f()
string s1(10);
s2 = s1;
Теперь создается только одна строка, а уничтожается
две. К неинициализированному объекту определенная пользователем операция присваивания не применяется. Беглый взгляд на



Ваше мнение



CAPTCHA