Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

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




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

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

Он воспринимает в качестве аргумента константную ссылку на объект класса (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. Следует также иметь в виду, что если описан явно хотя бы один из конструкторов, остальные также требуется определить явно. Наличие хотя бы одного явно определенного конструктора исключает автоматическое создание каких-либо других конструкторов.

 

Эта операция является функцией-элементом класса с именем 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;

}

comp (const comp& x)

{

Re=x.Re;

Im=x.Im;

};

void main()

{

comp x(1,2), y(-Ø.5,1.25);

comp z=x; //Вызывается конструктор копии

comp v,w; //Вызывается «пустой» конструктор

v=w=y; //Вызывается operator=()

}

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

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

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

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

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

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

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

 




Поделиться с друзьями:


Дата добавления: 2015-06-27; Просмотров: 393; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.016 сек.