实现一个只能在栈上生成对象的类

分析

  对象可以在栈上生成,也可以通过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;
}

猜你喜欢

转载自blog.csdn.net/adorable_/article/details/80101528
今日推荐