有效C++;:第52项以及如何避免隐藏所有正常操作员新&;删除版本 在Myer有效C++中的第52项(自定义new和Delphi)的结尾,他讨论了如何在实现自定义版本时避免隐藏正常的新版本和删除版本:
如果您在 类,您将隐藏所有这些标准 形式。除非你想阻止 禁止客户端使用这些表单, 请确保在中提供它们 添加到任何自定义运算符新 您创建的表单。对于每个操作员 你提供的新产品,当然是 请务必提供相应的 操作员也可以删除。如果你愿意 这些函数将在通常情况下运行 顺便说一句,只需要让你的班级具体化 版本称为全局版本 一个简单的方法是创建一个 基类包含所有正常的 新增和删除表格: 希望增强 可以使用带有自定义表单的标准表单 然后使用继承和使用 声明(见第33项)以获得 标准表格: 为什么要费心创建StandardNewDeleteForms类,从中继承,然后在派生类中说:有效C++;:第52项以及如何避免隐藏所有正常操作员新&;删除版本 在Myer有效C++中的第52项(自定义new和Delphi)的结尾,他讨论了如何在实现自定义版本时避免隐藏正常的新版本和删除版本:,c++,memory-management,C++,Memory Management,如果您在 类,您将隐藏所有这些标准 形式。除非你想阻止 禁止客户端使用这些表单, 请确保在中提供它们 添加到任何自定义运算符新 您创建的表单。对于每个操作员 你提供的新产品,当然是 请务必提供相应的 操作员也可以删除。如果你愿意 这些函数将在通常情况下运行 顺便说一句,只需要让你的班级具体化 版本称为全局版本 一个简单的方法是创建一个 基类包含所有正常的 新增和删除表格: 希望增强 可以使用带有自定义表单的标准表单 然后使用继承和使用 声明(见第33项)以获得 标准表格: 为什么要费心创建Sta
using StandardNewDeleteForms::operator new;
using StandardNewDeleteForms::operator delete;
您是否可以完全放弃基类,而简单地在Widget类中编写:
using ::operator new;
using ::operator delete;
要实现同样的目标?使用,这实际上是一个不可操作的
。他只是简单地展示了一个基类new
/delete
的实现,它将复制正常行为
通常,如果您正在创建一个自定义的new
和delete
,您将改变该基类和中的行为,并使用::operator new代码>将不再等效。在他的例子中,他没有这样做,所以发生了什么就不太清楚了。首先,不允许使用::operator new执行代码>因为它不是父类的成员
第二,全局新模式对于过载没有什么用处,因为大多数情况下:
1.您将使用使用或不使用此运算符的库,造成混乱;
2.您可能希望对不同类型的对象使用不同的新建/删除代码
此项背后的思想是,您可以更改继承父类的类的新建/删除行为,从而允许更改整个类组的分配策略。我正在读同一本书,我想知道完全相同的事情
管理使用的规则似乎取决于上下文:
在名称空间中使用时,它允许您将其他名称空间(包括全局名称空间)中的成员拉入新名称空间():
但是,在类定义中使用()时:
然后
嵌套名称说明符必须命名要定义的基类
嗨,我不太明白你的大部分答案,尤其是第一行?也许你可以详细解释一下?嗨,马克,谢谢你的回答,尽管我没有完全理解你的观点。你说:“这实际上是一个不可操作的用法。”,我不太明白你的意思是什么,所以我试着编译我的建议(使用::operator new;)我得到一个错误-'operator new':符号不能在使用声明的成员中使用,所以我猜语言规范根本不允许构造,即类成员的使用声明只能引用从基类继承的成员。我的想法正确吗?
using StandardNewDeleteForms::operator new;
using StandardNewDeleteForms::operator delete;
using ::operator new;
using ::operator delete;
void f();
namespace A {
void g();
}
namespace X {
using ::f; // global f is now visible as ::X::f
using A::g; // A::g is now visilbe as ::X::g
}
void h()
{
X::f(); // calls ::f
X::g(); // calls A::g
}
using nested-name-specifier