C++.Бархатный путь


Функции operator new() и operator delete() - часть 2


ВыражениеРазмещения

::= [::] new [Размещение] ИмяТипаNew [ИнициализаторNew] ::= [::] new [Размещение] (ИмяТипа) [ИнициализаторNew]

ИмяТипаNew ::= СписокСпецификаторовТипа [ОписательNew]

ОписательNew ::= [СписокCVОписателей] [ОписательNew] ::= [ОписательNew] [Выражение] ::= *****

При этом можно определить несколько различных вариантов операторной функции operator new. Перегруженные операторные функции будут различаться списками параметров. В C++ предусмотрены специальные средства передачи значений параметров подобным перегруженным операторным функциям. С этой целью используется так называемое Размещение, которое является необязательным составным элементом выражения размещения. Заключённый в круглые скобки список выражений располагается в выражении размещения непосредственно перед именем операторной функции new.

Мы объявляем простой класс, содержащий определения операторных функций распределения динамической памяти. И размещаем это объявление в заголовочном файле с именем TypeX.h.

// TypeX.h #ifndef TYPEX #define TYPEX /* Инструкции препроцессора используются для предотвращения многократного объявления класса в программном модуле. Даже если в исходном файле появится несколько инструкций препроцессора, обеспечивающих включение заголовочного файла TypeX.h, в исходном файле окажется всего лишь одно объявление класса TypeX. */ // Объявление класса TypeX. class TypeX { public: /* Встроенный конструктор */ TypeX() { cout << "Это TypeX()" << endl; } /* Встроенный конструктор с параметром */ TypeX(int x) { cout << "Это TypeX(" << x << ")" << endl; } /* Встроенный деструктор */ ~TypeX() { cout << "Это ~TypeX()" << endl; } /* Встроенная операторная функция operator new() */ void *operator new(size_t size) { cout << "Это void *operator new(" << size << ")" << endl; return new char(size); } /* Операторная функция operator new() с дополнительным параметром */ void *operator new(size_t size, int xPar) { cout << "void *operator new(" << size << "," << xPar << ")" << endl; return new char(size); } /* Встроенная операторная функция operator delete() */ void operator delete(void *cPoint, size_t size) { cout << "Это void operator delete(" << size << ")" << endl; if (cPoint) delete cPoint; }; }; #endif




- Начало -  - Назад -  - Вперед -