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

Это единственный механизм инициализации в данном случае.

Пример

class coord
 
{
 
const float x,y;
 
public:
 
coord(float a, float b):x(a),y(b)
 
{
 
}
 
};
 
class map
 
{
 
coord w;
 
public:
 
map (float_x , float_y):w(_x,_y)
 
{
 
}
 
};
 
voidmain( )
 
{
 
mapq(1Ø,15); //При создании объекта q класса map передаются данные для инициализации x(a), x(b)
 
}

18.4.2 Конструктор копии

Это конструктор специального вида.

Он воспринимает в качестве аргумента константную ссылку на объект класса (const тип_класса &) или простую ссылку на объект (тип_класса &).

Заголовки конструктора копииимеют вид

имя_класса ( const имя_класса&имя_источника_копирования)

или при простой ссылке

имя_класса (имя_класса&имя_источника_копирования).

Константную ссылку на объект ставят, чтобы избежать случайного присваивания источнику копирования.

Конструктор копии вызывается всякий раз, когда создается новый объект класса и его необходимо инициализировать значениями уже существующего объекта этого же класса (источника копирования).

Конструктор копии может создаваться автоматически (по умолчанию), если он не определен программистом явно при описании класса. Такой конструктор создает буквально копию объекта. Это не всегда приемлемо для объектов, содержащих указатели или ссылки.

Пример

#include <stdio.h>
 
class point
 
{
 
float x,y;
 
public:
 
point (float a, float b)
 
{
 
x=a;
 
y=b;
 
}
 
point (const point &src)
 
{
 
x=src.x;
 
y=src.y;
 
}
 
};
 
void main( )
 
{
 
point v(2.43, 8.1);
 
point w=v;
 
}

При создании объекта v класса point вызывается конструктор, который при этом одновременно инициализирует элементы-данные. В результате v.x=2.43, v.y=8.1.

При создании объекта w класса point вызывается конструктор копии. Вместо формального параметра src фактическим источником для копирования является созданный объект v. В результате w.x=2.43,w.y=8.1.

ВНИМАНИЕ! Если нужно запретить копирование объектов данного класса, необходимо явно определить конструктор копии и поместить его в область действия метки доступа private. Следует также иметь в виду, что если описан явно хотя бы один из конструкторов, остальные также требуется определить явно. Наличие хотя бы одного явно определенного конструктора исключает автоматическое создание каких-либо других конструкторов.

18.4.3 Операция присваивания

Эта операция является функцией-элементом класса с именем operator =. Воспринимает единственный аргумент типа const тип_класса& или тип_класса &. Имеет два вида:

тип_класса&operator =( constтип_класса & x )

тип_класса&operator =(тип_класса & x ).

Как и в конструкторе копии, const применяется в случае желания подстраховаться от ошибочного присваивания какого-либо значения передаваемому в функцию элементу источнику, значение которого должно присваиваться другому объекту.

Операция присваиваниявызывается компилятором, когда объекту присваивается значение другого объекта. Это может происходить неоднократно, а не только при создании объекта с инициализацией, когда вызывается конструктор копии. Также в отличие от конструктора копии операция присваивания может реализовать цепочку присваиваний, например:

x=y=b;

Если операция присваивания явно не определена, компилятор генерирует его по умолчанию. В этом случае реализуется побитовое присваивание. Это не всегда приемлемо для объектов, содержащих указатели или ссылки.

Рассмотрим пример явного определения операции присваивания на примере класса комплексных чисел.

Пример

class comp
 
{
 
float Re, Im;
 
public:
 
comp (float a, float b):Re(a),Im(b)
 
{
 
}
 
comp &operator=(const comp& src)
 
{
 
Re=src.Re;
 
Im=src.Im;
 
return *this;