禁止在堆中产生对象实现方式:将建立堆对象的new操作符声明为 private。
1、禁止用户直接实例化对象:
如:
class UPNumber {
private:
static void *operator new(size_t size);
static void operator delete(void *ptr);
...
};
//.cpp
UPNumber n1; // okay
static UPNumber n2; // also okay
UPNumber *p = new UPNumber; // 错误,尝试调用private operator new
2、派生类中实例化的情况:
class UPNumber { ... }; // 同上
class NonNegativeUPNumber: //假设这个类
public UPNumber { //没有声明 operator new
...
};
NonNegativeUPNumber n1; // 正确
static NonNegativeUPNumber n2; // 也正确
NonNegativeUPNumber *p = new NonNegativeUPNumber; // 错误! 试图调用 private operator new
3、包含中实例化的情况:
class Asset {
public:
Asset(int init Value);
...
private:
UPNumber value;
};
Asset *pa = new Asset(100); // 正确, 调用Asset::operator new 或 ::operator new,
// 不是UPNumber::operator new
疑问:在类Asset实例化时其中UPNumber类对象部分的实例化为什么可以成功(不应该仍是私有new无法调用吗),待解答,各位会的网友请告知。
此处先当个记录,会了再补上。
参考资料:More Effective C++ 条款M27
总结:
1、禁止在堆中产生对象实现方式:将建立堆对象的new操作符声明为 private。
本文探讨了在C++中如何通过将new操作符声明为private来防止对象在堆中创建,以此避免堆对象的产生。介绍了三种情况:直接实例化、派生类实例化及包含类中实例化,并讨论了为何在包含类中实例化私有new操作符的类仍能成功。
1142

被折叠的 条评论
为什么被折叠?



