
通常,构造函数/析构函数的声明位于public部分中. 如果它是私有的,会有什么后果?
那么,如何使用私有构造函数?两种方法: 1.在friend类的对象中使用该方法来创建它. 2.在此类中实现静态方法以创建它.
(1)私有构造函数定义

在程序中实例化一个对象,编译器将调用构造函数. 如果构造函数是私有的,则由于不允许在类外部访问私有成员,因此编译将失败. 如何解决这个问题呢?对于类本身,可以使用静态公共成员,因为它独立于类对象,因此可以在不构造对象的情况下使用它们!在静态函数中创建该类的对象,并将其作为引用或指针返回(不作为对象返回,主要是因为构造函数是私有的,并且无法在外部创建临时对象),因此可以正确使用该对象
问题: 静态成员函数似乎无法访问非静态成员,但是为什么它们可以访问私有构造函数?
[示例]

class OnlyHeapClass
{
public:
static OnlyHeapClass* GetInstance()
{
// 创建一个OnlyHeapClass对象并返回其指针
return (new OnlyHeapClass);
}
void Destroy();
private:
OnlyHeapClass() { }
~OnlyHeapClass() {}
};
int main()
{
OnlyHeapClass *p = OnlyHeapClass::GetInstance();
... // 使用*p
delete p;
return 0;
}
GetInstance()是OnlyHeapClass的静态成员函数,用于在内存中创建对象: 因为它是跨函数传递且不能按值传递,所以选择在堆上创建一个对象,即使getInstance()退出时,对象将不会释放,您可以手动释放它.
构造函数私有化的类的设计可确保其他类不能从此类继承或创建该类的实例.

也有这样的用法: 例如,实现这样的类: 它在内存中最多有一个或指定数量的对象(您可以在类的私有字段中添加静态类型计数器析构函数 私有,初始值设置为0,然后在GetInstance()中进行一些限制: 每次调用时,首先检查计数器的值是否已达到对象数的上限,如果是,则生成错误析构函数 私有,否则将创建一个新对象,并将计数器的值增加1. 最后,为了避免在复制该值时复制新对象,除了将构造函数设为私有之外,还必须将复制构造函数设置为专门声明并设为私有.
如果构造函数设计为“受保护”,则可以实现相同的目的,但是可以继承. (子类中的构造函数调用父类的私有构造函数是错误的,子类中的构造函数调用父类中的公共或受保护的构造函数是正确的. )
(2)析构函数私有

如何确保堆上只有新的类对象是新的?只需将析构函数定义为私有成员即可.
原因: C ++是一种静态绑定的语言. 在编译过程中,必须分析并完成所有非虚拟函数调用. 即使是虚拟功能,也需要检查可访问性. 因此,在堆栈上生成对象时,该对象将自动销毁,这意味着必须可以访问销毁器. 堆上对象的生成,因为破坏的时间由程序员控制,所以不一定需要析构函数. 在确保无法在堆栈上生成对象之后,您需要证明它可以在堆上生成. OnlyHeapClass和常规对象之间的唯一区别是其析构函数是私有的. 删除操作将调用析构函数. 因此无法编译. 那么你如何释放它呢?答案也很简单,提供一个成员函数来完成删除操作. 在成员函数中,可访问析构函数. 当然,也可以编译并传递detele操作.
void OnlyHeapClass::Destroy() {
delete this;
}
构造函数的私有化类的设计可以确保仅新命令可用于生成堆中的对象,并且只能动态创建对象,从而可以自由控制对象的生命周期. 但是,此类需要为创建和撤消提供通用接口.
转载:
自成立以来,小米鼠网一直专注于软件项目,人才招聘,软件商城等,始终秉承“服务,易用产品”的经营理念,“为客户提供高水平的服务”. 优质的服务,满足客户的需求. ”公司的目标是“需求,共同创造双赢”,为中国公司提供国际,,个性化的软件项目解决方案. 我们公司拥有一流的项目经理团队,并具有出色的软件项目设计和实施能力. 为全国不同行业的客户提供优质的产品和服务,赢得了客户的广泛好评.
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-235518-1.html
mo
另一方面要通过实际行动向美国表达坚决的意志
毕竟是有后台的公交