ВУЗ:
Составители:
Рубрика:
int size; /*-число символов в строке; */
string(int sz) {p=new char[size=sz];}/*-констру- */
~string() {delete p; }/* ктор и деструктор; */
void operator=(string&)/*-операция присваивания; */
};/*-конец определения структуры с операцией =; */
void string::operator=(string& a)/*-присваивание строки; */
{ if(this==&a) return;/*-переприсваивание исключается*/
delete p;
p=new char[size=a.size];
strcpy(p,a.p);
} /*-конец определения операции присваивания; */
В примере asgerr1 присваивание копированием s1=s2 изменяло
указатель p на строку символов в объекте s1.После присваива-
ния указатели p в обоих объектах s1 и s2 указывают на одну
и ту же строку из 20 символов.По завершении asgerr1 автомати-
чески дважды вызывается деструктор ~string() соответственно
для объекта s1 и s2 и дважды удаляется одна и та же строка с
непредсказуемо разрушительными последствиями.
void asgerr2(void) /*-ошибка при инициализации; */
{ string s1(10);/*-правильная структура; */
string s2=s1 ;/*-побитовое копирование s2 в s1; */
} /*-конец определения 2-го примера с ошибкой; */
Здесь создается только одна строка,а уничтожаются две.Вве-
дем в структуру конструктор вида:
void string::string(string& a)/*-конструктор копирования;*/
{ p=new char[size=a.size];
strcpy(p,a.p);
}/*-конец конструктора для инициализации по объекту;*/
Теперь инициализация и присваивание выполняются правильно:
30
int size; /*-число символов в строке; */ string(int sz) {p=new char[size=sz];}/*-констру- */ ~string() {delete p; }/* ктор и деструктор; */ void operator=(string&)/*-операция присваивания; */ };/*-конец определения структуры с операцией =; */ void string::operator=(string& a)/*-присваивание строки; */ { if(this==&a) return;/*-переприсваивание исключается*/ delete p; p=new char[size=a.size]; strcpy(p,a.p); } /*-конец определения операции присваивания; */ В примере asgerr1 присваивание копированием s1=s2 изменяло указатель p на строку символов в объекте s1.После присваива- ния указатели p в обоих объектах s1 и s2 указывают на одну и ту же строку из 20 символов.По завершении asgerr1 автомати- чески дважды вызывается деструктор ~string() соответственно для объекта s1 и s2 и дважды удаляется одна и та же строка с непредсказуемо разрушительными последствиями. void asgerr2(void) /*-ошибка при инициализации; */ { string s1(10);/*-правильная структура; */ string s2=s1 ;/*-побитовое копирование s2 в s1; */ } /*-конец определения 2-го примера с ошибкой; */ Здесь создается только одна строка,а уничтожаются две.Вве- дем в структуру конструктор вида: void string::string(string& a)/*-конструктор копирования;*/ { p=new char[size=a.size]; strcpy(p,a.p); }/*-конец конструктора для инициализации по объекту;*/ Теперь инициализация и присваивание выполняются правильно: 30
Страницы
- « первая
- ‹ предыдущая
- …
- 28
- 29
- 30
- 31
- 32
- …
- следующая ›
- последняя »