【发布时间】: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 new和operator delete。它们隐含为static。明确声明是合法的。从一开始就应该这样做,以避免这种混乱。 -
重载运算符 new 返回 void*。为什么在声明
OpNew *obj = new OpNew中我们得到转换 void* -> OpNew*?这样的覆盖不能在 C++ 中隐式完成,可以吗?
标签: c++ operator-overloading new-operator