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

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

这种题主要考的是对C++语法的理解,以及对C++语法的运用。

分析:
对象可以在栈上生成也可以由我们在堆上new出来。要想只在栈上生成对象而不能在堆上生成对象在类外

是无法完成的,我们必须从类的内部入手。

第一种方法时:我们知道类对象的构造是由构造函数完成的,如果我们把构造函数声明为私有或者保护类

型,那么在类外就不能调用构造函数,也就不能在类外面new出对象。但这样同时也不能在类

外定义对象。对此,我们需要在类里定义一个公有接口来返回成员函数的对象,之后在类外定

义类时,只需要调用这个函数即可。但这样还是有缺陷的,因为在类外只能通过类的对象来调

用这个成员函数,所以应该将这个接口声明为静态的。

//方法一
#include <iostream>

using namespace std;
class Stack
{
private:
    Stack(int stack = 0)
        :_stack(stack)
    {}
public:
    static Stack GetStackMemory()
    {
        return Stack();
    }
protected:
    int _stack;
};

int main()
{
    Stack stack = Stack::GetStackMemory();
    cout << "Sucess" << endl;
    return 0;
}

还有第二种方法:只声明operator new和operator delete而不定义。使用 new 关键词操作,其

过程分为两阶段:第一阶段,使用 new 在堆上寻找可用内存,分配给对象;第二阶段,调用构

造函数生成对象。将 new 操作设置为私有,那么第一阶段就无法完成,就不能够在堆上生成对

象。但这个方法存在一个缺陷,就是防止不了在静态区定义对象。

//方法二
class Stack
{
private:
    void* operator new(size_t size);  // 注意函数的第一个参数和返回值都是固定的
    void operator delete(void* p);    // 重载了new就需要重载delete
protected:
    int _stack;
};

Stack aa;     //此方法的缺陷在于防止不了在静态区定义对象

int main()
{
    //AA* p = new AA;   //失败(operator new+构造)
    Stack stcak;
    cout << "Sucess" << endl;
    return 0;
}

上一篇:C++ Primier Plus(第六版) 第十一章 使用类 编程练习答案


下一篇:哦呼!20211127 小测