构造函数和析构函数的权限问题

在ACIS库中,是不允许构造普通的类对象的,也就是不允许在栈上构建对象。能够实现这一功能,主要是将类的析构函数设置为了保护权限,这样类外对象调用析构函数是非法的,编译就不会通过。
在C++中析构函数和构造函数默认是public权限的,但是经常有改变其权限为proteced甚至privated。这篇博客讲的很清楚,https://blog.csdn.net/KingCat666/article/details/45048385。
下面对这篇博客做一个注释:

  • 博客中第一条就是解释了为什么许多父类的析构函数是虚函数。其原因也可以查看我的博客https://blog.csdn.net/qq_34489443/article/details/102502830中的第五条四种情况进行理解
  • 博客中第二条就是解释了将析构和构造函数设置为非public的使用环境
    • 其中2A中,即便在子类中不去声明析构函数,也仍然可以实现该功能,因为析构函数默认是public的
    • 2B中,为什么将析构函数设置为protected,栈上不能创建,但是堆上可以创建了呢?写了一个例子如下:
class A
{
public:
	A(){}
protected:
	virtual ~A() { cout << "finished"; }
};
class B : public A
{
public:
	B(){}
protected:
	~B() { cout << "finished"; }
};

int main()
{
	{
		B* b = new B;//可以通过编译,但是运行时不会执行到析构函数 
		B c;//不可以通过编译
	}
	system("pause");
}
  • 因为堆上的内存是不会自动销毁的,只有用户主动释放,所以在编译时,是不会去找到析构函数的问题。但是在栈上的内存是在临界区域结束后,会自动收回的,这是会自动去调用析构函数,此时编译就会找到问题,而报错。其实这样即便在堆上成功创建对象了,也会导致内存泄漏,是不可取的,应该像博客中的例子一样,写一个销毁函数。
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值