9、避免遮掩了new的正规形式
1、遮掩new的正规形式
内部的一个声明名称,会遮掩外边部的相同名称。即若全局区域和class内部都有函数f(),成员函数可能会遮掩掉全局函数。
因此,当给class加进一个operator new时,将不经意间妨碍调用new正规形式的能力。
class X {
public:
static void * operator new (size_t size, new_handler p);
...
};
void specialErrorHandler();
X *px1 = new (specialErrorHandler) X;
X *px2 = new X;//错误,调用global版本,失败!
2、避免遮掩了new的正规形式
1.一种方法是写一个class专属的operator new,并利用重载,让他支持正规调用形式。
class X {
public:
static void * operator new (size_t size, new_handler p);
static void * operator new (size_t size) {return ::operator new(size)}
};
2.另一种方法是为每一个额外的参数提供默认值。
class X {
public:
static void * operator new (size_t size, new_handler p = 0);
};