gpt4 book ai didi

使用虚拟参数的 C++ 类成员函数

转载 作者:太空狗 更新时间:2023-10-29 23:26:12 26 4
gpt4 key购买 nike

我知道您可以在 operator++operator-- 上使用虚拟“int”参数来覆盖这些运算符的后缀版本,但我依稀记得一些关于您可以在析构函数上声明的虚拟参数。有人知道吗?如果知道的话,那个虚拟参数做了什么?

这是我十几岁时读过的旧 Turbo C++ 教程书中的内容(即很久以前),所以我可能完全记错了。那也是非常早期的 C++,在它被标准化之前,所以它可能是特定于 Turbo C++ 的东西。

最佳答案

您可能正在考虑 operator delete 的 placement 和 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 构造对象的构造函数的情况下使用。抛出异常。通常你不必定义它们,因为编译器已经在死对象的基类和成员上调用了析构函数,并且对于新的放置没有内存可以释放。但如果您正在重载 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++ 类成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/267477/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com