Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ООП Экзамен.docx
Скачиваний:
2
Добавлен:
16.09.2019
Размер:
115.82 Кб
Скачать

19. Перегрузка new, delete.

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

Void *operator new (size_f size);

Void operator delete (void *); //void * - указатель на область памяти, //выделяемую под объект

size – размер объекта в байтах, size_t – тип размерности области памяти.

Переопределение этих операций позволяет написать собственное распределение памяти для объектов класса. Операции, не допускающие перегрузку: . (прямойвыбор члена объекта класса), .* (обращение к члену объекта класса, ?: (условная операция), :: (расщирение области видимости), sizeof (размер), # (препроцессорный оператор).

20. Преобразование типов, определяемых пользователем с помощью конструкторов и операций преобразования.

При работе со стандартными типами данных имеют место явное и неявное преобразования типов. По аналогии для классов могут быть определены такие же операции. Они ассоциируются с конструированием объектов.

“yyy” -> “xxx”

Если в программе встречается преобразование типа класса, то для осуществления этого преобразования необходим конструктор вида xxx (yyy &). Сами преобразования в этих случаях те же, что и обычные преобразования:

  1. при использовании операции присваивания, если она не определяется напрямую;

  2. при использовании явного преобразования;

  3. при неявном преобразовании типа формального параметра функции в случае передачи его по значению;

  4. при неявном преобразовании типа результата функции;

  5. при определении объекта класса xxx и инициализации его объекта класса yyy.

yyy b; xxx a = b;

При конструировании объекта класса yyy должна быть обеспечена доступность данных, например, посредством дружественности.

Рассмотрим преобразование объекта класса dat с базовым типом int и long. Сущность этого преобразования заключается в выполнении полного количества дней в дате, заданной входным объектом long и количество дней в текущем году в этой же дате (заданной int). Для задания этих операций необходимо определить в классе dat переопределяемые операции int и long, которые будут задаваться соответствующими функциями – элементами без параметров.

static int days[] = {0,31,28,31, … }

class dat

{

int day, month, year;

public:

operator int(); //происходит преобразование dat в int

operator long(); //происходит преобразование dat в long

long operator -(dat &p);

//происходит вычисление разности дат в днях

dat();

dat(char *);

};

dat :: operator int()

{

int r; //текущий результат

int i; //счетчик месяца

for(r=0,i=1;i<month;i++)

r+=days[month];

}

long dat :: operator – (dat &p)

{

return ((long)(*this)-(long)p);

}

void main()

{

dat a(“17-04-2012”); //задано строкой

dat b; //текущая дата

int c;

long d;

}

21. Неявное преобразование типов.

Неявное преобразование типа происходит при передаче в виде параметра функции по значению, а также при приведении типа результата функции. В качестве примера можно привести неявное преобразование вида целое = вещественное, где при выполнении оператора вещественное значение приводится к целому при возвращении результата в переменную целого типа. Однако для неявного преобразование также необходимо переопределять соответствующие операторы.