分析
对象可以在栈上生成,也可以通过new在堆上生成,如果只想要对象在堆上生成则需从类的内部结构入手。
类对象的构造是通过构造函数实现的,如果将构造函数声明为私有或者保护类型,那么在类外是不能调用构造函数的,在类外面也就不能从栈上生成对象。但这样同时也不能在类外new出一个对象。对此,我们可以在类里定义一个公有的接口返回成员函数new出的对象,之后在类外定义类时,只需调用这个函数即可 ,但这样还有缺陷,因为在类外只能通过类的对象来调用这个成员函数,所以应将这个接口声明为静态的。
实现
class AA
{
private:
AA(int aa = 0)
:_aa(aa)
{}
//类的防拷贝
//1.只声明不定义
//2.声明成私有
AA(const AA& aa);
public:
static AA* GetAAObj()
{
return new AA;
}
protected:
int _aa;
};
int main()
{
AA* p = AA::GetAAObj();
//AA aa(*p); //栈上定义的对象,若想要其定义失败,应使用类的防拷贝
return 0;
}