分析
对象可以在栈上生成,也可以通过new在堆上生成,如果只想要对象在栈上生成则需从类的内部结构入手。
方法一:类对象的构造是通过构造函数实现的,如果将构造函数声明为私有或者保护类型,那么在类外是不能调用构造函数的,也就不能在类外面new出对象。但这样同时也不能在类外定义对象。对此,我们可以在类里定义一个公有的接口返回成员函数生成的对象,之后在类外定义类时,只需调用这个函数即可 ,但这样还有缺陷,因为在类外只能通过类的对象来调用这个成员函数,所以应将这个接口声明为静态的。
方法二:只声明operator new和operator delete而不定义。在new一个对象是会同时调用operator new和构造,而operator new只声明而为定义导致new一个对象失败。但这个方法存在一个缺陷,就是防止不了在静态区定义对象。
实现
//方法一
class AA
{
private:
AA(int aa = 0)
:_aa(aa)
{}
public:
static AA GetAAOBj()
{
return AA();
}
protected:
int _aa;
};
int main()
{
AA aa = AA::GetAAOBj();
return 0;
}
//方法二
class AA
{
private:
void* operator new(size_t size);
void operator delete(void* p);
protected:
int _aa;
};
AA aa; //此方法的缺陷在于防止不了在静态区定义对象
int main()
{
//AA* p = new AA; //失败(operator new+构造)
AA aa;
return 0;
}