将析构函数设为私有有什么用?
当前回答
这样的对象永远不能在堆栈上创建。总是在堆上。删除必须通过朋友或会员来完成。一个产品可以使用一个Object层次结构和一个自定义内存管理器——这样的场景可以使用一个私有的dtor。
#include <iostream>
class a {
~a() {}
friend void delete_a(a* p);
};
void delete_a(a* p) {
delete p;
}
int main()
{
a *p = new a;
delete_a(p);
return 0;
}
其他回答
Dirkgently错了。下面是一个在堆栈上创建了私有c-tor和d-tor的对象的例子(我在这里使用静态成员函数,但它也可以用friend函数或friend类来完成)。
#include <iostream>
class PrivateCD
{
private:
PrivateCD(int i) : _i(i) {};
~PrivateCD(){};
int _i;
public:
static void TryMe(int i)
{
PrivateCD p(i);
cout << "inside PrivateCD::TryMe, p._i = " << p._i << endl;
};
};
int main()
{
PrivateCD::TryMe(8);
};
这段代码将产生输出: 在PrivateCD::TryMe, p._i = 8
基本上,任何时候你想让其他类负责你类对象的生命周期,或者你有理由阻止对象的销毁,你都可以将析构函数设为private。
例如,如果您正在做一些引用计数的事情,您可以让对象(或已被“好友”化的管理器)负责计算对自己的引用数量,并在数量为零时删除它。私有dtor可以防止其他人在仍然有引用的情况下删除它。
另一个例子是,如果你有一个对象,它有一个管理器(或它本身),可以根据程序中的其他条件(比如正在打开的数据库连接或正在写入的文件)销毁它或拒绝销毁它。您可以在类或管理器中有一个“request_delete”方法,它将检查该条件,它将删除或拒绝,并返回一个状态,告诉您它做了什么。这比调用delete要灵活得多。
COM使用此策略删除实例。COM使析构函数私有,并提供删除实例的接口。
下面是一个Release方法的示例。
int MyRefCountedObject::Release()
{
_refCount--;
if ( 0 == _refCount )
{
delete this;
return 0;
}
return _refCount;
}
ATL COM对象就是这种模式的一个主要例子。
这可能是在Windows中处理问题的一种方法,其中每个模块可以使用不同的堆,例如Debug堆。如果这个问题处理不当,就会发生不好的事情。
当您不希望用户访问析构函数时,也就是说,您希望只通过其他方式销毁对象。
http://blogs.msdn.com/larryosterman/archive/2005/07/01/434684.aspx给出了一个例子,其中对象被引用计数,并且只有当计数为零时才会被对象本身销毁。
推荐文章
- 什么是“参数依赖查找”(又名ADL,或“Koenig查找”)?
- 公共朋友交换成员函数
- 如何在Go中使用c++
- 自定义c++分配器的引人注目的例子?
- RAII和c++中的智能指针
- 如何构建和使用谷歌TensorFlow c++ api
- 断言是邪恶的吗?
- 下面这些短语在c++中是什么意思:0 -,default-和value-initialization?
- 在STL地图中,使用map::insert比[]更好吗?
- C++ Linux的想法?
- 如何为Fedora安装g++ ?
- Std::cin输入空格?
- c++标准是否要求iostreams的性能很差,或者我只是在处理一个糟糕的实现?
- gcc在哪里查找C和c++头文件?
- 为什么我们需要require require ?