Курс ООП в С презентация. ООП в с++(полный курс). Объекты и классы
Скачать 1.76 Mb.
|
КонструкторыПоследующее изменение значения строки приводит также и к изменению результата, возвращаемого функцией get_name(). Однако замещение адреса исходного элемента адресом строки *Names[1] не изменяет возвращаемого функцией значения: ASU-00-0 ASU-92-1 ASU-02-2 ASU-92-1 Причиной этого является то, что ссылка name лишь один раз связывается с объектом, на который первоначально указывал элемент Names[0]. Значение name не определяется при каждом обращении подобно разыменованию указателя (*Names[0]), почему изменение значения самого указателя и не дало предполагаемого результата. КонструкторыКонструктор копирования – это специальный вид конструктора, получающий в качестве единственного параметра указатель на объект этого же класса (Т — имя класса): Т::T(const T&) { ... /* тело конструктора */ } Этот конструктор вызывается в тех случаях, когда новый объект создается путем копирования существующего:
при передаче объекта в функцию по значению; при возврате объекта из функции. //копирующий конструктор, делаем новый объект по подобию исходного person::person(const person& orig) { name = new char[strlen(orig.name)+1]; strcpy(name, orig.name); year = orig.year; } Конструкторы//копирующий конструктор, делаем новый объект по подобию исходного person::person(const person& orig) { name = new char[strlen(orig.name)+1]; strcpy(name, orig.name); year = orig.year; } Если программист не указал ни одного конструктора копирования, компилятор создаст его автоматически. Такой конструктор выполняет поэлементное копирование полей. Если класс содержит указатели или ссылки, это, скорее всего, будет неправильным, поскольку и копия, и оригинал будут указывать на одну и ту же область памяти. Конструкторы#include "stdafx.h" #include "person.h" void print(person x) //объект передается по значению { cout << x.get_name() << " / " << x.get_age() << endl; } person set_info() //объект возвращается как значение функции { char s[20]; int y; person p; cout > s; p.set_name(s); cout > y; p.set_year(y); return p; } Конструкторыvoid main() { //вызов конструктора без параметров для создания объекта a: person a; //вызов конструктора с параметрами для создания объекта b: person b("Abram",1977); //вызов конструктора копирования для создания объекта c: person c = b; //вызов конструктора с параметрами для безымянного объекта //и вызов конструктора копирования для определения объекта d: person d = person("Gurgen",1942); //вызов конструктора без параметров для создания безымянного //объекта, размещаемому по адресу, хранящемуся в указателе pp1: person* pp1 = new person; //вызов конструктора с параметрами для создания безымянного //объекта, размещаемого по адресу, хранящемуся в указателе pp2: person* pp2 = new person("Ivan",1978); //вызов конструктора копирования для возврата значения функцией person e = set_info(); //вызов конструктора копирования для создания объекта-параметра //функции: print(a); print(b); print(c); print(d); print(*pp1); print(*pp2); print(e); } КонструкторыКопирующий конструктор предназначен для создания нового объекта по подобию уже существующего, но это не то же самое, что и копирующий оператор присваивания. Тот должен правильно работать с уже созданным объектом. Деструкторы ДеструкторыЕсли создание объекта подразумевает выделение каких-либо ресурсов, то таким классам требуется функция, которая освободит ресурсы, выделяемые конструктором. Такая функция называется деструктором, она будет автоматически вызвана при уничтожении объекта. Деструктор не имеет параметров и возвращаемого значения. Вызов деструктора выполняется неявно, при уничтожении объекта класса. Если в классе деструктор не определен явно, то компилятор генерирует деструктор по умолчанию, который просто освобождает память, занятую данными объекта. В тех случаях, когда требуется выполнить освобождение ресурсов, выделенных конструктором, необходимо определить деструктор явно. Деструктор вызывается автоматически, когда объект удаляется из памяти:
для глобальных — как часть процедуры выхода из main; для объектов, заданных через указатели, деструктор вызывается неявно при использовании операции delete. Имя деструктора начинается с тильды (), непосредственно за которой следует имя класса. |