ВУЗ:
Составители:
Рубрика:
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
- …
- следующая ›
- последняя »
