C++中如何设计一个类只能在堆或者栈上创建对象

设计一个类,该类只能在堆上创建对象

  • 将类的构造函数私有,拷贝构造声明成私有。防止别人调用拷贝在栈上生成对象。
  • 提供一个静态的成员函数,在该静态成员函数中完成堆对象的创建

注意

  1. 在堆和栈上创建对象都会调用构造函数,为了防止在栈上创建对象我们将构造函数私有化。
  2. 拷贝构造函数是在栈上创建对象。
 1 class HeapOnly
 2 {
 3 public:
 4     static HeapOnly* CreateObject()
 5     {
 6         return new HeapOnly;//这使得创建该类对象都只能通过new,确保了该类只能在堆上创建对象
 7     }
 8
 9 private:
10     HeapOnly(){}//在堆和栈上创建对象都会调用构造函数,为了防止在栈上创建对象我们将构造函数私有化
11     HeapOnly(const HeapOnly&) = delete;//拷贝构造函数是在栈上创建对象
12 };

设计一个类,该类只能在栈上创建对象

方法一:

  • 将类的构造函数私有。防止在堆上创建对象
  • 提供一个静态的成员函数,在该静态成员函数中完成栈对象的创建

注意

  1. 在堆和栈上创建对象都会调用构造函数,为了防止在堆上创建对象,应该将构造函数私有化。
 1 class StackOnly
 2 {
 3 public:
 4     static StackOnly CreateObject()
 5     {
 6         return StackOnly();//确保了该类创建对象时不会使用new操作符,从而使得该类只能在栈上创建对象
 7     }
 8 private:
 9     StackOnly(){}//在堆和栈上创建对象都会调用构造函数,为了防止在堆上创建对象,应该将构造函数私有化
10 };

方法二 只能在栈上创建对象,即不能在堆上创建,因此只要将new的功能屏蔽掉即可,即屏蔽掉operator new和定位new表达式,注意:屏蔽了operator new,实际也将定位new屏蔽掉。

1 class StackOnly
2 {
3 public:
4     StackOnly()  {}
5 private:
6     void* operator new(size_t size);
7     void operator delete(void* p);
8 };  

注意

  • new和delete是用户进行动态内存申请和释放的操作符,operator new 和operator delete是系统提供的全局函数,new在底层调用operator new全局函数来申请空间,delete在底层通过operator delete全局函数来释放空间。
  • operator new函数实际通过malloc来申请空间,当malloc申请空间成功时直接返回;申请空间失败,尝试 执行空间不足应对措施,如果改应对措施用户设置了,则继续申请,否则抛异常。
  • operator delete函数最终是通过free来释放空间的

原文地址:https://www.cnblogs.com/al-fajr/p/11846269.html

时间: 2024-08-01 13:53:41

C++中如何设计一个类只能在堆或者栈上创建对象的相关文章

作业题---设计一个类,求和的方法,求乘积的方法

设计一个类: 包含$a,$b,求和的方法,求乘积的方法,  可以对变量进行初始化, $a,$b必须大于0小于100 class suanshu{ private $shuzi1; private $shuzi2; function __construct($a,$b) { $this->shuzi1 = $a; $this->shuzi2 = $b; } function __set($n,$v) { if($v>0 and $v<100) { $this->$n = $v;

在VS2010中如何删除一个类(使之在Class View中不再出现)?

在 解决方案管资源管理器 中分别选择要删除的类的.h和.cpp文件,然后右键选择"移除",会弹出移除 删除 取消 三个选项,选择"移除",只是将类的文件从工程中删除,但文件还在工程的目录下保存着,选择"删除",就将文件从硬盘上删掉了 在VS2010中如何删除一个类(使之在Class View中不再出现)?,布布扣,bubuko.com

Java中如何查看一个类依赖的包

Java中如何查看一个类依赖的包 如图, 我如何知道JSONArray是依赖的哪一个包呢,这里有两个json-lib包? ? 测试语句: ? public static void main(String[] args) { ????????ProtectionDomain pd = JSONArray.class.getProtectionDomain(); ????????CodeSource cs = pd.getCodeSource(); ????????System.out.printl

如何限制一个类只在堆上分配和栈上分配(StackOnly HeapOnly)

[本文链接] http://www.cnblogs.com/hellogiser/p/stackonly-heaponly.html [题目] 如何限制一个类只在堆上分配和栈上分配? [代码] C++ Code 1234567891011121314   class StackOnly { private:     void *operator new(size_t size) {}; }; class HeapOnly { public:     void destroy(); private

设计一个类,我们只能生成该类的一个实例。

    单例模式的要点有三个:一是某个类只能有一个实例:二是它必须自行创建这个实例:三是它必须自行向整个系统提供这个实例. 从具体实现角度来说,就是以下三点:一是单例模式的类只提供私有的构造函数,二是类定义中含有一个该类的静态私有对象,三是该类提供了一个静态的公有的函数用于创建或获取它本身的静态私有对象. #include<iostream> #include<stdlib.h> using namespace std; class Csingleton { private: Cs

Python中怎样初始化一个类类class?

1 # 12-1 FP树的类定义 2 class treeNode: 3 def _init_(self,nameValue,numOccur,parentNode): 4 self.name=nameValue; # 节点的名字 5 self.count=numOccur; # 出现次数 6 self.nodeLink=None; # 链接相似的元素项 7 self.parent=parentNode; # 父节点 8 self.children={}; # 子节点 9 def inc(sel

往虚拟机中加载一个类

准备一个已编译好的class文件, public class DClassLoader extends ClassLoader{ public Class<?> loadByte(byte[] classByte){ return defineClass(null, classByte, 0, classByte.length); } public staitc void main(String[] args){     byte[] classByteStream = null;     c

MFC中如何在一个类中调用另一个类的控件

学习记录: 两个类,一个为主类 1个为:CCkDlg,主类 1个为: Https,用来做HTTPS请求获得页面状态. 测试界面如下: CCkDlg 类里定义函数 void CCkDlg::printf_r(CString str) //用于输出日志信息 { m_log.SetSel(-1,-1); m_log.ReplaceSel(str + "\r\n",1); } Https 类里: #pragma once class CCkDlg; //集成cckDlg class Https

CI框架中一个类中调用另一个类中已经加载对象测试

controller.php 1 <?php 2 class CI_Controller { 3 4 private static $instance; 5 6 public function __construct() 7 { 8 self::$instance =& $this; 9 10 foreach (is_loaded() as $var => $class) 11 { 12 $this->$var =& load_class($class); 13 $obj