在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
一般情况下写一个类都是可以采用new在堆上分配空间,或直接采用 类名+对象名 的方式在栈上分配空间。但有时候,如果想让一个类只能在栈上或者堆上分配空间,又该怎么实现呢? 下面分别来介绍如何定义只能在栈上或堆上实例化的类。 注: 只能在栈上分配类对象只有使用new运算符,对象才会建立在堆上,因此要禁用new运算符才能只在栈上分配空间。但new操作符是C++内建的,所以必须要先认清一个事实即:new operator总是先调用operator new,所以我们只要堆new操作符进行重载,并将它声明为private的,就能保证不能再使用new实例化对象,如: class A{ private: void* operator new(size_t t){} void operator delete(void* ptr){} public: A(); ~A(); }; 那么此时就不能再调用new操作符了。 只能在堆上实例化对象容易想到的方法是将构造函数私有化,那么在类外就不能实例化对象,只能在类内提供一个共有函数使用new运算符返回一个对象,这也是典型的单例模式的由来,但在类外还是不能使用new操作符进行实例化。所以这种方法是行不通的。 所以考虑析构函数的私有化。因在栈上实例化对象之后,对象使用完毕之后自动调用析构函数,而new对象后,要手动调用delete函数才能执行对象的析构函数。 这就会引发另外一个问题,使用new操作符在堆上实例化的对象要怎么析构呢?解决办法就是,在类中自定义一个公有函数用来销毁对象,该函数调用delete操作符,这样就可以使用该函数销毁对象而不是直接使用delete操作符了。 class A{ public: A(){} void destroy(){delete this;} private: ~A(){} }; 在此,就可以使用new在堆上创建对象而使用destroy()析构对象了。 注意:采用这种方式后,类A不能用在继承体系当中。 |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论