【问题标题】:Overloading operator new for a class为类重载运算符 new
【发布时间】:2011-07-21 08:13:43
【问题描述】:

当我们重载类的 new 操作符时,我们将函数声明为成员函数。 例如:

class OpNew {
public:
    OpNew() { cout << "OpNew::OpNew()" << endl;}
    void* operator new(size_t sz) {
         cout << "OpNew::new: "
            << sz << " bytes" << endl;
         return ::new char[sz];
    }
};

OpNew *obj = new OpNew 语句在后台是如何工作的?因为重载的 new 是 OpNew 类的成员,而不是静态的。那么编译器如何确保对new 成员函数的调用成功呢?

【问题讨论】:

  • 我希望你也重载operator delete,否则你有未定义的行为。
  • 我当然做到了,那只是一个 sn-p :)
  • @Nikolai N Fetissov 什么应该是静态的?运算符 new 始终是静态的;您不必将其声明为静态(我什至不确定这样做是否合法)。
  • @James,是的,operator newoperator delete。它们隐含为static。明确声明是合法的。从一开始就应该这样做,以避免这种混乱。
  • 重载运算符 new 返回 void*。为什么在声明 OpNew *obj = new OpNew 中我们得到转换 void* -> OpNew*?这样的覆盖不能在 C++ 中隐式完成,可以吗?

标签: c++ operator-overloading new-operator


【解决方案1】:

An operator new() or operator new[]() for a class is always a static class member, even if it is not declared with the keyword static.

C++ 标准的内容(草案 n3242),在[class.free] 部分:

T 的任何分配函数都是静态成员(即使没有显式声明static)。

【讨论】:

    猜你喜欢
    • 2020-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多