ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-11-25 20:02:41  阅读:107  来源: 互联网

标签:定义 对象 stack int operator new 生成 Stack


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

这种题主要考的是对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;
}

标签:定义,对象,stack,int,operator,new,生成,Stack
来源: https://blog.csdn.net/Grey_Pigeon/article/details/121545046

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有