有默认情况下静态的成员函数吗?

时间:2018-07-29 14:39:32

标签: c++ operator-overloading static-methods

默认情况下,重载的operator new是否被认为是静态的?例如:

template <typename E>
class Link
{
private:
    Link<E>* freeList;
public:
    E element;
    Link<E>* next;
    Link(const E& elemVal, Link<E>* nextVal) { element = elemVal; next = nextVal; }
    Link(Link<E>* nextVal) { next = nextVal; }

    void* operator new(size_t)
    {
        Link<E>* temp=freeList;
        freeList=freeList->next;
        return temp;
    }
};

当我尝试编译它时,出现以下错误:

Invalid use of member 'Link<E>::freeList' in static member function.

我想知道重载的operator new是否实际上是静态的。

2 个答案:

答案 0 :(得分:4)

是的!类特定的operator newoperator delete的重载是静态成员函数。它们不能是“常规”成员函数,因为在调用它们时没有实例可用。他们在那里(去)分配原始存储。对于这两个对象,那时都没有对象实例。

这在[class.free]/1中有描述:

  

类T的任何分配函数都是静态成员(即使不是)   明确声明为静态)。

还有[class.free]/5

  

类X的任何释放函数都是静态成员(即使   没有明确声明为静态)。

答案 1 :(得分:3)

是的,static关键字对于operator new是可选的,当它被定义为类的成员函数时,它将始终是static成员函数。

(重点是我的)

  

单对象和数组分配函数都可以定义为类的公共静态成员函数(版本(15-18))。如果定义,则这些分配函数将由new-expressions调用,以为此类的单个对象和数组分配内存,除非新表达式使用形式:: new绕过类范围查找。 关键字static对于这些函数是可选的:无论是否使用,分配函数都是静态成员函数。