2010-11-16 1 views
1

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

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

void operator delete(void*) {} 

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

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

Любой, кто объяснит мне, что эти две линии функционируют.

+0

У вас есть возможность вызвать вторую перегрузку с помощью выражения delete? – Chubsdad

+0

его не перегружать .. его преодоление .. на самом деле я не понял эти две функции – Model

+0

Один вопрос: почему? Разработать; чего вы пытаетесь достичь? Если вам требуется специальное поведение, когда ваш класс освобожден, напишите деструктор. – Ashe

ответ

0

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

+0

нет, я не понимаю .. – Model

+1

Это неприятный уголок C++. Обычно, когда вы вызываете new и delete, вы будете использовать реализацию компилятора C++ для фактического выделения и освобождения памяти. C++ позволяет вам переопределить это поведение, но вы можете объявить свои собственные версии новых и удалить. Если вы (или другой автор) это сделаете, вы можете делать всевозможные сумасшедшие (а иногда и полезные) вещи, и вы можете добавить дополнительные аргументы в вызовы new и delete. Эта тема немного глубже, чем я могу сейчас, но Google для «размещения нового» и «удаления места размещения», и вы найдете много информации. – xscott

+0

ahhan ok спасибо! – Model

1
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 вне собственного кода класса не будет компилироваться (недоступная функция освобождения). И если так, то это может быть весь смысл - или, не удивляйтесь, если нет никакого смысла.

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

Приветствия & НТН.,

+2

теперь я чувствую, что я должен купить книгу C++ .. скоро – Model

+1

+1 Думая на C++ - хорошая книга, особенно. для тех, кто знает о программировании в первую очередь. Если вы знаете о некоторых ошибках в книге, я бы сказал, что Эккель был бы доволен, если бы указал на него. – daramarak

+0

@ daramarak Я упоминал об ошибках, потому что хороший Брюс не зафиксировал ошибки, поэтому люди задавали одни и те же вопросы снова и снова с годами. Cheers, –

0

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

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

И в 12.5 Свободный магазин:

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

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

+0

Его можно вызывать вручную или его можно вызывать с помощью выражения 'new', которое вызывается соответствующим новым местом размещения, если конструктор выбрасывает. Это единственный случай, когда удаление места размещения вызывается автоматически. Microsoft однажды применила «умную» идею использования нового места для поддержки отладки, но забыла определить соответствующее удаление места размещения. В результате эта память была пропущена, но только в отладочных сборках ... :-) Это была одна из самых печально известных ошибок MFC. Cheers, –

+0

@Alf Я не знал об этом, спасибо :) – icecrime