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

UptoLike

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

string::~string() /*-деструктор класса для всех вариантов */
/*-конструирования объектов; */
{ if(--p->n==0)/*-когда была одна ссылка: */
{ delete p->s;/*-удаление поля данных; */
delete p;/*-удаление пары s и n; */
}
} /*-конец определения деструктора string;*/
Заметим,что здесь p->s может быть равен нулю,тогда опера-
цией delete ничего не удаляется,что как раз и необходимо для
пустого объекта.
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;/*-возврат ссылки на объект слева;*/
} /*-конец присваивания объекту другого объекта; */
34
 string::~string() /*-деструктор класса для всех вариантов */
                      /*-конструирования объектов;              */
                   { if(--p->n==0)/*-когда была одна ссылка:    */
                       { delete p->s;/*-удаление поля данных; */
                           delete p;/*-удаление пары s и n;     */
                       }
                    } /*-конец определения деструктора string;*/


 Заметим,что здесь p->s может быть равен нулю,тогда опера-
цией delete ничего не удаляется,что как раз и необходимо для
пустого объекта.
 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;/*-возврат ссылки на объект слева;*/
          } /*-конец присваивания объекту другого объекта;       */


                                34