iis服务器助手广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++栈对象的产生和禁用方式
  • 555
分享到

C++栈对象的产生和禁用方式

2023-06-17 17:06:52 555人浏览 泡泡鱼
摘要

本篇内容介绍了“c++栈对象的产生和禁用方式”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!创建C++栈对象时会移动栈顶指针以“挪出”适当大小

本篇内容介绍了“c++栈对象的产生和禁用方式”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

创建C++栈对象时会移动栈顶指针以“挪出”适当大小的空间,然后在这个空间上直接调用对应的构造函数以形成一个栈对象,而当函数返回时,会调用其析构函数释放这个对象,然后再调整栈顶指针收回那块栈内存。在这个过程中是不需要operat or newdelete操作的,所以将operator newdelete设置为private不能达到目的。当然从上面的叙述中,你也许已经想到了:将构造函数或析构函数设为私有的,这样系统就不能调用构造析构函数了,当然就不能在栈中生成对象了。

这样的确可以,而且我也打算采用这种方案。但是在此之前,有一点需要考虑清楚,那就是,如果我们将构造函数设置为私有,那么我们也就不能用new来直接产生堆对象了,因为new在为对象分配空间后也会调用它的构造函数啊。所以,我打算只将析构函数设置为private。再进一步,将析构函数设为private除了会限制栈对象生成外,还有其它影响吗?是的,这还会限制继承。

如果一个类不打算作为基类,通常采用的方案就是将其析构函数声明为private。

为了限制C++栈对象,却不限制继承,我们可以将析构函数声明为protected,这样就两全其美了。如下代码所示:

class NoStackObject   {   protected   ~NoStackObject() { }   public   void destroy()   {   delete this ;调用保护析构函数   }   };

接着,可以像这样使用NoStackObject类:

NoStackObject hash_ptr = new NoStackObject() ;   ... ... 对hash_ptr指向的对象进行操作   hash_ptr-destroy() ;

是不是觉得有点怪怪的,我们用new创建一个对象,却不是用delete去删除它,而是要用destroy方法。很显然,用户是不习惯这种怪异的使用方式的。所以,我决定将构造函数也设为private或protected。这又回到了上面曾试图避免的问题,即不用new,那么该用什么方式来生成一个对象了?我们可以用间接的办法完成,即让这个类提供一个static成员函数专门用于产生该类型的堆对象。(设计模式中的singleton模式就可以用这种方式实现。)让我们来看看:

class NoStackObject   {   protected   NoStackObject() { }   ~NoStackObject() { }   public   static NoStackObject creatInstance()   {   return new NoStackObject() ;调用保护的构造函数   }   void destroy()   {   delete this ;调用保护的析构函数   }   };

现在可以这样使用NoStackObject类了:

NoStackObject hash_ptr = NoStackObjectcreatInstance() ;   ... ... 对hash_ptr指向的对象进行操作   hash_ptr-destroy() ;   hash_ptr = NULL ; 防止使用悬挂指针

“C++栈对象的产生和禁用方式”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: C++栈对象的产生和禁用方式

本文链接: https://www.lsjlt.com/news/290891.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作