Функции-члены класса C ++, которые используют фиктивные параметры - PullRequest
2 голосов
/ 06 ноября 2008

Я знаю, что вы можете использовать фиктивный параметр "int" в operator++ и operator-- для переопределения постфиксных версий этих операторов, но я смутно припоминаю кое-что о фиктивном параметре, который вы могли бы объявить в деструкторе. Кто-нибудь знает что-нибудь об этом, и если да, то что сделал этот фиктивный параметр?

Это было в моих старых учебниках по Turbo C ++, которые я читал, когда я был подростком (т. Е. давно назад), так что я, возможно, полностью запомнил это. Это был также очень ранний C ++, до того как он был стандартизирован, так что вполне возможно, что это было что-то специфичное для Turbo C ++.

Ответы [ 5 ]

6 голосов
/ 06 ноября 2008

Возможно, вы думаете о формах размещения и удаления операторов, которые имеют подписи:

void operator delete(void *, void *) throw();
void operator delete(void *, const std::nothrow_t&) throw();
void operator delete[](void *, void *) throw();
void operator delete[](void *, const std::nothrow_t&) throw();

Они никогда не вызываются во время нормальной работы, но будут использоваться в случае, когда конструктор для объекта, который создается с размещением new , вызывает исключение. Как правило, вам не нужно их определять, так как компилятор уже вызвал деструктор (ы) в базах и членах мертвого объекта, и для размещения нового нет памяти, которую нужно освобождать. Но может существовать, если вы перегружаете место размещения новым и вам нужен соответствующий оператор.

Второй аргумент на самом деле не используется, а просто отличает сигнатуру для обычного:

void operator delete(void *)

Это не специальные фиктивные аргументы, как у оператора ++. Они просто являются экземпляром общего правила, которое вызывает new с дополнительными аргументами, такими как:

obj = new(x,y,z) Object(a,b,c) 

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

void *raw = operator new(sizeof(Object), x,y,z)
try {
    obj = new(raw) Object(a,b,c);
} catch(...) {
   operator delete(raw,x,y,z);
   throw;
}
5 голосов
/ 06 ноября 2008

Либо вы заблуждаетесь, либо вы должны попытаться забыть об этом. Деструкторы не имеют параметров, возвращаемых типов и не должны выдавать исключения.

2 голосов
/ 06 ноября 2008

Возможно, вы думаете о новом размещении?

class MyClass { /* ... */ };

char * raw_mem = new char [sizeof (MyClass)];
pMyClass = new (raw_mem) MyClass;
// ...
pMyClass-->(~MyClass());
delete[] raw_mem;
2 голосов
/ 06 ноября 2008

Клянусь, я слышал то же самое, но в FAQ по C ++, похоже, говорится, что такой формы нет.

1 голос
/ 19 ноября 2008

Ты не сумасшедший. Я определенно видел параметр int в деструкторе раньше. Используя компилятор HP на OpenVMS, я скомпилировал пример программы, показанный ниже. Список символов включает деструктор с параметром int. Я могу только догадываться, что это зависит от компилятора.

$ create foo.cxx
class foo
{
 ~foo() {}
};

$ cxx foo.cxx

$ type [.CXX_REPOSITORY]cxx$demangler_db.
CX3$_ZN3FOOD1EV31GNTHJ         foo::$complete$~foo()
CX3$_ZN3FOOD2EV30KQI3A         foo::$subobject$~foo()
CX3$_ZN3FOOD9EV36HH9SB         foo::~foo(int)
CXXL$_ZDLPV                    void operator delete(void *)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...