详解如何定义一个只能在堆上/栈上生成的类

       相信有很多同学和我一样都遇到过这个问题,而且都无处下手,在网上搜答案可能也看不太明白,今天重新回顾了一下这个知识点,感觉掌握起来其实不难,相信你看完这篇博客 就能明白大笑

1.如何定义一个只能在堆上生成的类

     方法一:首先我们要在堆上定义一个对象的时候一定要用new ,比如A *a=new A;
C++会先在堆上malloc一块内存,然后执行构造函数。
     相信有些人看到这个题都会这样想:
class A
{
public:
	A()
	{
		return new A;
	}

};

     看到这里不要笑,因为我一开始有这样想过,为什么不行呢?原因是无限递归调用构造函数,好阔怕快哭了
     想到这里既然不能再构造函数里调用new来构造,那就重新定义一个函数Creat()来new,然后在类外调用Creat()完成构造。想到这里,感觉不错。
    还没完人家要求只能在堆上生成对象,那么也就是说你要生成一个对象只能调用
Creat(),不能使用构造函数。所以我们只能把构造函数定义为私有。
    如果你以为这样就完了,那你还是和我一样年轻。这样做是会报错滴!我直接贴上正确的代码
class C
{
public:
	static C* Creat(int c)//如果不加stati会报错,非静态成员与特定对象相对
	{
		return new C(c);
	}
private:
	C(int c)
	{
		_c=c;
	}
	~C()
	{}

	int _c;
};


int main()
{
	C* c=C::Creat(3);//这里只能由类访问
	system("pause");
	return 0;
}

   至此第一种方法我已经说清楚了。

       方法二:这里涉及到一个知识点:编译器在为类对象分配栈空间时,会先检查类的析构函数的访问性,其实不光是析构函数,只要是非静态的函数,编译器都会进行检查。如果类的析构函数是私有的,则编译器不会在栈空间上为类对象分配内存。

所以便有了下面的代码:
class  A  
{  
public :  
    A(){}  
    void  destory(){ delete   this ;}  
private :  
    ~A(){}  
}; 
怎么样不难理解吧。

          2.如何定义一个只能在栈上生成的类
     我们的思路还是和上面差不多,将构造函数设为私有的,然后重新定义一个公有函数调用构造函数。如果你试图在堆上建立一个对象,这样写D* d=new D;那就执行不过去,因为构造函数声明为私有,你无法访问到。
class D
{
public:
	static D Creat(int d)
	{
		return D(d);
	}

private:
	D(int d)
	{
		_d=d;
	}
	int _d;
};

int main()
{
        D d=D::Creat(5);
	system("pause");
	return 0;
}


老铁们儿,双击666啊!




  






  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值