覆盖运营商

时间:2010-11-16 06:24:57

标签: c++ override overloading new-operator

任何关于构造函数覆盖的人......

我有这个

void  operator delete(void*) {}

void  operator delete(void* p, void*) {}

在我的班级..看起来像重载(相同的函数名称和返回类型,但不同的参数列表),但它覆盖..如何覆盖..

任何人解释我这两行的功能。

3 个答案:

答案 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 可以访问解除分配。

但是,为了使其无法访问,可能会将释放函数声明为privateprotected。在第一种情况下,类'自己的代码之外的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时,应使用地址调用所选的释放函数   要回收的存储块作为其第一个参数和(如果使用双参数样式)的大小   块作为第二个参数

我不确定你的第二个函数是否可以调用,因为它不是'通常的释放函数'。