我从来没有完全理解运算符重载的参数列表是如何以系统的方式确定的,而且我对我现在遇到的一个问题感到特别困惑。
当您重载一元运算符时,它有一个参数,如果它是类成员则为零。当您重载二元运算符时,它有两个参数,或者如果它是类成员则有一个。至少它看起来是这样工作的。但是,我遇到了operator new
(不是班级成员)的问题。
在我正在工作的代码库中,就像我过去看到的其他地方一样(例如这里),有一个定义类似#define new new(__FILE__, __LINE__)
和一个相应的函数,带有签名void *new(size_t size, const char *file, unsigned line)
或类似的东西,用于内存调试。我注意到我项目中的那个实际上与之前链接的那个不同。这对我来说是个问题,因为出于某种原因它搞砸了新的展示位置。我查看了The C++ Programming Language,如果它解释了这一点,我就错过了。
在这方面有什么new
特别之处,即它是否具有特定语言定义的额外调试签名?看起来不像是因为,正如我上面提到的,我在不同的地方看到了稍微不同的签名。如果有,还有哪些其他运营商有非显而易见的签名,它们是什么?这些不同的签名是不是一些特定于实现的附加功能?如果是这样,是否有关于大多数实现的一般规则?或者,这是否像我在标题中暗示的那样是一个问题?您可以在签名中添加任意数量的额外参数吗?如果您使用new
关键字本身和您想要的新类型之间的参数调用 new,您可以做任何事情?还是我更加困惑,我还缺少其他东西?
最重要的是在短期内(虽然我真的很想了解这一点),我的位置发生了什么混乱new
?宏正在引起类似的扩展new ("file.cpp", 100) (class_pointer) class_t
。可能是括号中的两组问题,还是其他问题?