C++ 类对象只在heap中

#include <iostream>

/* 若想对象申请在堆空间中,可以将构造或析构函数进行私有化
若构造函数私有化则,类似单例模式,只能在类中调用构造函数,类外无法构造对象
也无法使用new进行创建对象指针,因为类默认有构造、析构、赋值、拷贝,必须
用户所有都显示的将他们都声明private,若果是有编译器自动产生,则都是public;
所有最好办法是将析构函数声明为private,因为一个classs只有一个析构函数
*/
class Base{
public:
    static Base CreateObject(){
        return Base();
    }
private:
    Base(){}
};


void Test()
{
    //Base* p = new Base;
    //Base b;

    // 虽然构造函数私有,但由编译器提供的赋值构造函数可以进行类外赋值
    // 仍然无法对象只能申请在堆空间中
    Base b = Base::CreateObject();
    Base b1(b);//拷贝
}

class Base1{

public:
    void Destroy() const{
        if (this != nullptr) delete this;
    }
private:
    ~Base1(){}
};

// 虽然析构函数设置为private,但妨碍了继承和内含场景
void Test1(){
    // Base1 b;// error, 析构函数私有

    // 私有new在堆空间申请
    Base1 *p = new Base1();
    // delete p; 析构函数是私有的
    p->Destroy(); // ok
}

class Derived: public Base1{

};

class Contact{
private:
    Base1 b;
};

class Contact1{
public:
    Contact1(): p(new Base1){}
private:
    Base1* p;
};
void Test2(){
    // Derived d;// error, 父类析构函数是私有的

    // Contact c;// error ,Base1析构函数是私有的

    // 克服子类继承父类时无法创建对象,只需要将父类析构函数private改为protected
    // 克服其他类内含析构函数为私有的类对象,则只需要在内含类中将类对象改为类对象指针

    Contact1 c;// ok
}


int main()
{

    Test();

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值