Язык С++ для системного программирования. Имена-этикетки. Класс как область действия, страница 8

}
 
comp (const comp& x)
 
{
 
Re=x.Re;
 
Im=x.Im;
 
};
 
void main( )
 
{
 
comp x(1,2), y(-Ø.5,1.25);
 
compz=x; //Вызывается конструктор копии
 
compv,w; //Вызывается "пустой" конструктор
 
v=w=y; //Вызывается operator=( )
 
}

Рассмотрим более детально, как реализуется последовательное присваивание v=w=y;

По знаку присваивания <=> вызывается функция-элемент operator=( ). Объект у является фактически параметром, которым инициализируется ссылка

constcomp &src в функции operator=( ).

Адрес объекта w заносится в указатель this функции-элемента операции присваивания. Таким образом, после окончания присваивания по return*this будут получены значения w.Re=- Ø.5;w.Im=1.25.

После этого снова вызывается operator=( ). В качестве фактического параметра передается w, а адрес объекта v заносится в указатель this и т. д.

Именно return*this, возвращающий ссылку, отличает operator=( ) от конструктора копии.

ВНИМАНИЕ! Если необходимо закрепить присваивание, нужно явно определить operator=( ) и поместить его в область действия метки доступа private.

18.4.4 Деструктор

Это дополнение к конструктору. Он имеет то же имя, что и класс, но с префиксом-тильдой (~). Вызывается всякий раз, когда уничтожается объект данного класса. Заголовок деструктора имеет вид

~имя_класса( )

Для деструктора существуют следующие правила:

  • не может иметь аргументов;
  • не может возвращать значения;
  • не наследуется;
  • не может быть объявлен как const, volatile, static.

Если деструктор явно не определен, он создается компилятором по умолчанию.

Деструктор вызывается по умолчанию:

  • при выходе из области видимости;
  • когда возвращаемые функцией значения объектов данного класса больше не нужны;
  • при выполнении операции delete для объектов, размещенных в динамической памяти.

Если нужно разрушить отдельный объект, можно вызвать деструктор явно имя_объекта. ~ имя_класса ( );

Например, s. ~tree( );Разрушен объектs классаtree.

this- > ~tree( );Явное разрушение объекта класса tree, адрес которого находится в указателе tris.

18.4.5 Функции преобразования

Для встроенных типов (int, long, char и др.) имеется возможность явного преобразования типа. Необходимость такого преобразования может возникать и для объектов того или иного класса. Объекты класса могут быть преобразованы к другому типу или с помощью конструкторов преобразования , или специальной операции приведения.

18.4.6 Конструкторы преобразований

Если конструктор класса А воспринимает единственный аргумент типа В, то говорят, что В может быть приведен к А с помощью преобразования конструктором. Другими словами, компилятор может использовать конструктор класса А с аргументом типа В,чтобы получить А из В. Сказанное рассмотрим на примере комплексных чисел.

Пример.

class comp
 
{
 
float Re, Jm;
 
public:
 
comp (float a, float b)
 
{
 
Re = a;
 
Jm = b;
 
}
 
comp ( float a )
 
{
 
Re = a; 
 
Jm = Ø;
 
}
 
 comp ( )
 
{
 
}
 
};
 
void main ( )
 
{
 
float r = 96;
 
comp a(2, -2), b = r;
 
compc;
 
c = b;
 
}

При создании объекта а вызывается конструктор с двумя параметрами.

В результатеa. Re = 2

a.Jm = -2.

Затем вызывается конструктор с одним параметром. Создается объект b c элементами данныхb. Re = 96

b.Jm = Ø.

Из объекта r типа float с помощью конструктора создан объект класса comp.

При создании объекта c вызывается "пустой" конструктор. Далее в результате присваивания будет получено

с.Re = 96

с.Jm = Ø.

18.4.7 Операция приведения

Это функции-элементы класса, которые осуществляют явное преобразование типа класса к другому типу. Они имеют следующий вид: