Объектно-ориентированный язык программирования С++ в примерах. Сивохин А.В. - 30 стр.

UptoLike

Составители: 

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