Effective C++ 笔记9: 重载操作符 new 时不要把“正常”的 new 格式给覆盖掉
如果我们重载了一个类的 operator new,那么我们对这个类进行 new 操作时就一定只会调用重载的 new 函数,看看下面的代码:
class A{
public:
static void * operator new (size_t size, new_handler p);
}
void NoMoreMemory();
int main(){
A * a1=new(NoMoreMemory) A; // ok, calls A::operator new
A * a2=new A; // error! "function does not take 1 parameter"
...
}
为什么第二个出会错呢?因为我们重载了 operator new,所以只要我们对A进行 new 操作,那编译器就只会去 A 中找被重载的 new,而这里被重载的 new 只有一个,它必需带两个参数(其中 size 是系统自动加的),所以第二种用法会出错。
因为我们通常会用第二种用法,所以这里也就将它称为"正常"的 new。
怎么避免这种情况呢?最简单的方法就是再重载一个只带参数 size 的 operator new,如下:
class A{
public:
static void * operator new (size_t size, new_handler p);
static void * operator new (size_t size);
}
void NoMoreMemory();
int main(){
A * a1=new(NoMoreMemory) A; // ok, calls A::operator new (size_t size, new_handler p);
A * a2=new A; // ok, calls A:: operator new (size_t size);
...
}
另外一种方法就是用默认参数,如下:
class A{
public:
static void * operator new (size_t size, new_handler p=0);
}