我知道您可以使用虚拟“int”参数operator++
并operator--
覆盖这些运算符的后缀版本,但我隐约记得您可以在析构函数上声明的虚拟参数。有谁知道这一点,如果知道,那个虚拟参数做了什么?
这是在我十几岁时(即很久以前)阅读的旧 Turbo C++ 教程书籍中,所以我可能完全记错了它。那也是非常早期的 C++,在它被标准化之前,所以它可能是 Turbo C++ 特有的。
我知道您可以使用虚拟“int”参数operator++
并operator--
覆盖这些运算符的后缀版本,但我隐约记得您可以在析构函数上声明的虚拟参数。有谁知道这一点,如果知道,那个虚拟参数做了什么?
这是在我十几岁时(即很久以前)阅读的旧 Turbo C++ 教程书籍中,所以我可能完全记错了它。那也是非常早期的 C++,在它被标准化之前,所以它可能是 Turbo C++ 特有的。
您可能正在考虑 operator delete 的放置和 nothrow 形式,它们具有以下签名:
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();
这些在正常操作期间从不调用,但会在使用placement new构造的对象的构造函数引发异常的情况下使用。通常你不必定义它们,因为编译器已经在死对象的基类和成员上调用了析构函数,并且对于放置 new 没有要释放的内存。但是如果您重载placement new 并且需要相应的运算符,则可以存在。
第二个参数并没有真正使用,只是区分普通的签名:
void operator delete(void *)
不过,这些不是 operator++ 的特殊虚拟参数。它们只是使用额外参数调用 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;
}
要么你记错了,要么你应该试着忘记它。析构函数没有参数、返回类型,它们不应该抛出异常。
我发誓我听说过同样的事情,但C++ FAQ 似乎说没有这种形式。
也许您正在考虑安置新的?
class MyClass { /* ... */ };
char * raw_mem = new char [sizeof (MyClass)];
pMyClass = new (raw_mem) MyClass;
// ...
pMyClass-->(~MyClass());
delete[] raw_mem;
你没疯。我之前肯定在析构函数中看到过 int 参数。在 OpenVMS 上使用 HP 的编译器,我编译了一个示例程序,如下所示。符号列表确实包含一个带有 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 *)