条款九: 避免隐藏标准形式的new
2024-09-17 10:48:30
因为内部范围声明的名称会隐藏掉外部范围的相同的名称,所以对于分别在类的内部和全局声明的两个相同名字的函数f来说,类的成员函数会隐藏掉全局函数
class x {
public:
void f(); // operator new的参数指定一个
// new-hander(new的出错处理)函数
static void * operator new(size_t size, new_handler p);
}; void specialerrorhandler(); // 定义在别的地方 x *px1 =
new (specialerrorhandler) x; // 调用x::operator new x *px2 = new x; // 错误!
在类里定义了一个称为“operator new”的函数后,会不经意地阻止了对标准new的访问。解决办法是在类里写一个支持标准new调用方式的operator new,它和标准new做同样
的事。这可以用一个高效的内联函数来封装实现。
class x {
public:
void f(); static void * operator new(size_t size, new_handler p); static void * operator new(size_t size)
{ return ::operator new(size); }
}; x *px1 =
new (specialerrorhandler) x; // 调用 x::operator
// new(size_t, new_handler) x* px2 = new x; // 调用 x::operator
// new(size_t)
另一种方法是为每一个增加到operator new的参数提供缺省值(见条款24):
class x {
public:
void f(); static
void * operator new(size_t size, // p缺省值为0
new_handler p = ); //
}; x *px1 = new (specialerrorhandler) x; // 正确 x* px2 = new x; // 也正确
最新文章
- 【UOJ #13】【UER #1】跳蚤OS
- LeetCode Paint House
- 用Nginx+Lua(OpenResty)开发高性能Web应用
- 一些不起眼但非常有用的 Vim 命令
- [No00000E]PPT快捷键大全 PowerPoint2013/2010/2007/2003常用快捷
- .net程序员转行做手游开发经历(四)
- java8 引进lamda
- [LintCode] Binary Tree Paths 二叉树路径
- 20145224&;20145238《信息安全系统设计基础》实验五
- 剑指Offer:面试题23——从上往下打印二叉树(java实现)
- tomcat的配置详解:[1]tomcat绑定域名
- Yii 的AR单行数据自动缓存机制
- PHP MySQL Where 子句 之Where
- Javascript Base64编码与解码
- python的web开发环境Django配置
- Swift tableview自带的刷新控件
- centos下安装nginx并部署angular应用
- Redis 设计与实现 (九)--Lua
- [20180828]exadata--豆腐渣系统的保护神.txt
- 【AtCoder】ARC077