Переопределяющий оператор - PullRequest
1 голос
/ 16 ноября 2010

кто-нибудь мне о переопределении конструктора ..

у меня есть это

void  operator delete(void*) {}

void  operator delete(void* p, void*) {}

в моем классе .. это похоже на перегрузку (то же имя функции и тип возврата, но другой список параметров), ноего переопределение .. как переопределение ..

кто-нибудь, объясните мне эти две строки функции.

Ответы [ 3 ]

1 голос
/ 16 ноября 2010
void  operator delete(void*) {}
void  operator delete(void* p, void*) {}

Это пользовательские функции освобождения. Функция освобождения вызывается через выражение delete. Э.Г.

YourClass* p = new YourClass();    // Allocates memory & calls constructor
// ... whatever, then
delete p;                          // Calls destructor & deallocates memory

Для вашего класса выражение delete в последней строке выше сначала вызовет деструктор, а затем вызовет функцию освобождения одного аргумента void*, которую определяет класс, первую из двух ваших функций, если то освобождение доступно.

Однако, возможно, функция освобождения объявлена ​​как private или protected, чтобы сделать ее недоступной. В первом случае выражение delete вне собственного кода класса не будет компилироваться (недоступная функция освобождения). И если так, то в этом весь смысл - или, не удивляйтесь, если в этом нет никакого смысла.

Кстати, посмотрите на этот урок . Это, по-видимому, наименее плохое бесплатное введение в C ++ в сети. Электронная книга Брюса Экеля «Мышление в C ++» также бесплатна, но в ней есть некоторые ошибки и дезинформация (хотя раньше это было наоборот, хотя учебник на cplusplus.com был очень плохим, один раз).

Приветствия и hth.,

0 голосов
/ 16 ноября 2010

Это перегрузка удаления оператора, которая вызывается, когда delete вызывается для объекта. От 3.7.3.2 (функции распределения):

Каждая функция освобождения должна возвращать void, а ее первый параметр должен быть void *. Функция освобождения может иметь более одного параметра. Если класс T имеет функцию освобождения члена с именем operator delete только с одним параметром, тогда эта функция является обычной (не размещаемой) функцией освобождения . Если класс T не объявляет такой оператор удаления, но объявляет функцию освобождения члена именованный оператор delete с двумя параметрами, второй из которых имеет тип std :: size_t (18.1), то эта функция является обычной функцией освобождения.

А в 12.5 Бесплатный магазин:

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

Я не уверен, что ваша вторая функция когда-либо может быть вызвана, поскольку она не является «обычной функцией освобождения».

0 голосов
/ 16 ноября 2010

Они перегружают оператор удаления, а второй использует "удаление размещения". Размещение new / delete является хаком, так что вы можете иметь конструкторы C ++, инициализирующие класс поверх предоставляемой вами памяти (вместо :: new), и, возможно, с дополнительными аргументами, как вы видите здесь. Google может заполнить вас кровавыми подробностями.

...