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

UptoLike

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

программе и к зависанию системы.А если учесть,что эта опера-
ция используется и для инициализации объекта при его опреде-
лении,когда вызывается конструктор по умолчанияю для такого
же побитового копирования составного объекта,то последствия
от неправильного использования операции "=" могут быть еще
более разрушительными.Чтобы избежать всего этого,необходи-
мо:
1)для рассматриваемого составного типа Х ввести конструк-
тор вида Х(Х&), осуществляющий построение нового объекта по
ссылке на уже созданный;лишь в частном случае,это построение
может свестись к побитовому копированию,когда такое копиро-
вание допустимо;
2)для операции присваивания в составном типе вводят функ-
цию,которая задает этой операции новую семантику;очень час-
то определяемое присваивание сначала удаляет объект слева
от знака присваивания,а затем заменяет его копией объекта
справа от этого знака.
Приведем несколько примеров.
struct string /*-строка символов с указателем ее длины; */
{ char* p; /*-указатель на строку символов; */
int size;/*-число символов в строке; */
string(int sz) {p=new char[size=sz];}/*-констру-*/
~string() {delete p;}/* ктор и деструктор; */
};/*-конец определения структуры строка; */
void asgerr1(void)/*-ошибка в операции присваивания: */
{ string s1(10);/*-строка из 10 символов; */
string s2(20);/*-строка из 20 символов; */
s1=s2;/*-побитовое копирование структуры s1 и s2; */
}/*-конец определения 1-го примера с ошибкой; */
Введем в определение структуры собственнную операцию при-
сваивания:
struсt string /*-строка символов с указателем ее длины; */
{ char* p; /*-указатель на строку символов; */
29
программе и к зависанию системы.А если учесть,что эта опера-
ция используется и для инициализации объекта при его опреде-
лении,когда вызывается    конструктор по умолчанияю для такого
же побитового копирования составного объекта,то последствия
от неправильного использования операции "=" могут быть еще
более разрушительными.Чтобы избежать всего этого,необходи-
мо:
  1)для рассматриваемого составного типа Х ввести конструк-
тор вида Х(Х&), осуществляющий построение нового объекта по
ссылке на уже созданный;лишь в частном случае,это построение
может свестись к побитовому копированию,когда такое копиро-
вание допустимо;
  2)для операции присваивания в составном типе вводят функ-
цию,которая задает этой операции новую семантику;очень       час-
то определяемое присваивание сначала удаляет объект слева
от знака присваивания,а затем заменяет его копией объекта
справа от этого знака.
  Приведем несколько примеров.


  struct string /*-строка символов с указателем ее длины;           */
         { char* p;      /*-указатель на строку символов;           */
             int   size;/*-число символов в строке;                 */
              string(int sz) {p=new char[size=sz];}/*-констру-*/
              ~string() {delete p;}/* ктор и деструктор;            */
             };/*-конец определения структуры строка;               */


  void asgerr1(void)/*-ошибка в операции присваивания:              */
       { string s1(10);/*-строка из 10 символов;                    */
         string s2(20);/*-строка из 20 символов;                    */
         s1=s2;/*-побитовое копирование структуры s1 и s2;          */
       }/*-конец определения 1-го примера с ошибкой;                */


  Введем в определение структуры собственнную операцию при-
сваивания:


  struсt string /*-строка символов с указателем ее длины;           */
         { char* p;       /*-указатель на строку символов;          */


                               29