条款M27:要求或禁止在堆中产生对象(2):禁止在堆中产生对象

本文探讨了在C++中如何通过将new操作符声明为private来防止对象在堆中创建,以此避免堆对象的产生。介绍了三种情况:直接实例化、派生类实例化及包含类中实例化,并讨论了为何在包含类中实例化私有new操作符的类仍能成功。

禁止在堆中产生对象实现方式:将建立堆对象的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。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值