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

本文探讨如何通过在C++中调整构造函数的可见性和使用静态成员函数,来限定对象只能在栈或堆上创建。通过将构造函数设为保护的,并提供一个静态公共接口来获取堆上的对象,可以实现对象只能在堆上创建。反之,如果要限制对象在栈上创建,同样原理,但需确保对象在类内部生成并由静态成员函数返回。
摘要由CSDN通过智能技术生成

如何定义一个只能在栈上生成对象的类?(考察对C++语法的理解及应用)
分析:对象可以在栈上生成也可以由我们在堆上new出来。要想只在栈上生成对象而不能在堆上生成对象在类外是无法完成的,因此我们必须从类的内部入手。
我们知道,类对象的构造是由构造函数完成的,如果我们把构造函数声明为保护的,使得不能在类外调用构造函数,这样的话就不能在类外new出对象了,但同时也不能在类外定义对象了。为此我们可以在类内部生成一个对象并提供一个公有的接口来返回这个对象。接下来如果在类外定义类对象的话,只需调用这个函数即可。但是在类外只能由对象调用类成员函数,因此想到的解决方法是将这个接口声明为静态成员函数,这样问题就能解决。
代码示例:

class AA  
{  
public:  
       static AA GetObject(int a)  
       {  
              return AA(a);  
       }  
protected:  
       AA(int a)  
       {  
              _a = a;  
       }  
private:  
       int _a;  
};  
void test()  
{  
       AA &a=AA::GetObject(10);  
}  

如何定义一个只能在栈上生成对象的类?(考察对C++语法的理解及应用)
分析:对象可以在栈上生成也可以由我们在堆上new出来。要想只在堆上生成对象而不能在栈上生成对象在类外是无法完成的,必须从类的内部入手。类对象的构造是由构造函数完成的,如果我们把构造函数声明为保护的,使得不能在类外调用构造函数,这样类外就不能从栈上生成对象了,但同时也不能在类外new出对象了。为此我们可以在类内new一个对象并提供一个公有的接口来返回这个对象,接下来如果在类外定义类对象的话只需要调用这个函数即可,但是由于在类外只能由类对象调用类成员函数,所以我们将这个接口声明为静态成员函数就解决了问题。
代码示例:

class AA  
{  
public:  
       static AA* GetObject(int a)  
       {  
              return new AA(a);  
       }  
       ~AA()  
       {  
              delete this;  
       }  
protected:  
       AA(int a)  
       {  
              _a = a;  
       }  
private:  
       int _a;  
};  
void test()  
{  
       AA *a = AA::GetObject(10);  
}  

(备注:代码示例来源参考)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值