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);
};