对象只能创建在堆上

#include <iostream>
using namespace std;
//如何禁止在栈上创建对象
//1.将构造函数设置为私有 --错误 将无法创建对象 A a; new class A;都会报错 因为构造是私有的 编译器无法调用
//2.将析构函数设置为私有 --正确 析构是私有的 用户无法调用析构释放内存 会产出内存泄漏 需要自行提供释放内存的方法
//                              delete this;delete会调用析构 因为在类内部 可以调用析构
//解析:
//      当对象创建在栈上的时候,由编译器管理对象的整个生命周期
//      将析构函数设置为私有,在栈上创建对象A a;编译器会检查对象的构造和析构是否正常,因为析构是私有,所以编译器
//      无法分配内存给这个对象。
class A{
        public:
                A(){cout << "A()" << endl;};
                //~A(){};
                void destory(){delete this;}
                void play(){
                        cout << "play" << endl;
                }
                int m_pub = 11;
        protected:
                ~A(){cout << "~A()" << endl;}
                int m_pro = 12;
        private:
                //~A(){cout << "~A()" << endl;}
                int m_pri = 10;
};
//优化
//如果子类需要继承A 那么A的析构必须是虚析构
class B : protected A
{
        public:
                B(){cout << "B()" << endl;}
                void play1(){cout << "A = " << m_pub << endl;}
                void play2(){
                        cout << "A pro = " << m_pro << endl;
                }
};

//对象只能创建在栈上
//只有使用new运算符,对象才会建立在堆上,因此,只要禁用new运算符就可以实现类对象只能建立在栈上。将operator new()设为私有即可
class C
{
        public:
                void play()
                {cout << "play c" << endl;}
        private:
                void * operator new(size_t size);
                void operator delete(void *p);
};
int main()
{
        //析构是私有的 在栈上创建 会报错error: ‘A::~A()’ is private within this context
        //class A a;
        //a.play();
        class A *a = new class A();
        a->play();
        a->destory();

        class B b;
        b.play1();
        b.play2();

        class C c;
        c.play();

        //‘static void* C::operator new(size_t)’ is private within this context
        //class C *d = new class C;
        return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值