建立实例化对象

#include<iostream>
#include<string>

using String = std::string;

class Entity
{
private:
    String m_Name;
public:
    Entity()
        :m_Name("Unknow"){}
    Entity(const String& name)
        :m_Name(name){}
    const String& GetName() const
    {
        return m_Name;
    }
};

int main()
{
    Entity entity;//使用栈内存建立,不同的方法初始化
    Entity entity1("Wangtn");
    Entity entity2 = Entity("WTN");
    std::cout << entity.GetName() << std::endl;


    std::cin.get();
}

如果我们在主函数外写一个函数,用同样的方式(堆栈)新建实例化对象

void Print()
{
    Entity e;
    std::cout << e.GetName() << std::endl;
}

那么当我们跳出这个函数,e也将不再存在,生命周期结束。如果我们在主函数中这么写

int main()
{
    Entity *e0;
    {
        Entity entity;//使用栈内存建立,不同的方法初始化
        Entity entity1("Wangtn");
        Entity entity2 = Entity("WTN");
        e0 = &entity;
        std::cout << entity.GetName() << std::endl;
    }

    std::cin.get();
}

通过设置断点可以查看到,在大括号内时,e0指向如图

 

 

 

 

 

 运行到第二个断点发现这个实例已经不存在了,因此我们需要用堆来创建他们,而且栈的空间相对较小,在创建较大的实例时一般采用栈

使用堆来创建实例的话数据类型应该改下,要使用指针类型。这一过程是new在堆上申请空间来存放这个新的实例,然后通过指针返回这个申请的内存的地址

int main()
{
    Entity *e0;
    {
        Entity* entity1=new Entity("Wangtn");//使用堆新建实例
        e0= entity1;
        std::cout << (*entity1).GetName() << std::endl;
    }
    std::cin.get();
}

使用new新建实例后一定要手动将他删除,因为在c++中,程序不能自动释放

delete entity1;

 

posted @ 2020-04-22 16:15  Wangtn  阅读(295)  评论(0编辑  收藏  举报