任何关于构造函数覆盖的人......
我有这个
void operator delete(void*) {}
void operator delete(void* p, void*) {}
在我的班级..看起来像重载(相同的函数名称和返回类型,但不同的参数列表),但它覆盖..如何覆盖..
任何人解释我这两行的功能。
答案 0 :(得分:1)
void operator delete(void*) {}
void operator delete(void* p, void*) {}
这些是自定义释放功能。通过delete
表达式调用释放函数。 E.g。
YourClass* p = new YourClass(); // Allocates memory & calls constructor
// ... whatever, then
delete p; // Calls destructor & deallocates memory
对于您的类,上面最后一行中的delete
表达式将首先调用析构函数,然后它将调用类定义的单void*
参数解除分配函数,这是您的两个函数中的第一个, if 可以访问解除分配。
但是,为了使其无法访问,可能会将释放函数声明为private
或protected
。在第一种情况下,类'自己的代码之外的delete
表达式将不会编译(不可访问的释放函数)。如果是这样那么这可能就是重点 - 或者,如果没有任何意义,也不要感到惊讶。
顺便说一句,看看this tutorial。这显然是网上C ++最简单的免费介绍。布鲁斯·埃克尔的电子书"Thinking in C++"也是免费的,但它有一些错误和错误信息(过去常常是另一种方式,cplusplus.com上的教程曾经很糟糕,曾经)。
干杯&第h。,
答案 1 :(得分:0)
他们正在重载删除操作符,第二个是使用“放置删除”。放置new / delete是一个hack,这样你就可以让C ++构造函数在你提供的内存之上初始化类(而不是:: new),并且可能还有你在这里看到的其他参数。 Google可以为您提供血腥的详细信息。
答案 2 :(得分:0)
这些是运算符删除重载,并在对象上调用delete
时调用。从3.7.3.2(解除分配函数):
每个释放函数都应返回void,其第一个参数应为void *。释放功能 可以有多个参数。 如果类T具有名为operator的成员释放函数 只用一个参数删除,那么该函数是通常的(非放置)释放函数。如果 class T没有声明这样的运算符删除,但确实声明了成员释放函数 命名运算符删除只有两个参数,第二个参数类型为std :: size_t (18.1),那么这个函数就是通常的释放函数。
在12.5 Free store:
当执行delete-expression时,应使用地址调用所选的释放函数 要回收的存储块作为其第一个参数和(如果使用双参数样式)的大小 块作为第二个参数。
我不确定你的第二个函数是否可以调用,因为它不是'通常的释放函数'。