建立实例化对象
#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;
无情的摸鱼机器