在栈/堆上创建并初始化C++对象

c 复制代码
#include <iostream>
class Entity {
private:
	std::string name;
public:
	Entity():name("unknown") {
		std::cout << name << " Creat susscifully!" << std::endl;
	}
	Entity(const std::string& name):name(name){
		std::cout << name << " Creat susscifully!" << std::endl;
	}
	~Entity() { std::cout << "Clear " << name << " object!" << std::endl; }
	std::string getname() {
		return name;
	}
};
int main() {
    {
        Entity Teru("Miyanaga Teru");
        std::cout << Teru.getname() << std::endl;
        std::cout << (&Teru)->getname() << std::endl;
    }//这里栈上的Teru的作用域结束,编译器自动释放内存
    
    Entity* Ichigo = new Entity("Kurosaki Ichigo");
    std::cout << Ichigo->getname() << std::endl;
    delete Ichigo;
    
    Entity* Gotei13 = new Entity[13]{ {} ,{"suifeng"},{"gin"}};
    delete[] Gotei13;
}

对于一个类Entity,我们可以在栈上创建该类的对象,

arduino 复制代码
Entity Teru("Miyanaga Teru");

Teru即为对象的名称,&Teru访问地址。 在栈上创建的变量由编译器自动管理,使用结束后会自动执行析构函数~Entity释放内存。

在堆上创建对象,需要使用new关键字来申请内存。

ini 复制代码
Entity* Ichigo = new Entity("Kurosaki Ichigo");

这里new Entity("Kurosaki Ichigo")实际上就是申请的内存的地址。在堆上创建对象我们得到的都是对象的地址,所以用的是指针形式Entity* Ichigo。从地址直接访问该对象中的元素可以使用箭头Ichigo->getname(),或者利用一般的方式(*Ichigo).getname()

我们在利用new关键字申请内存后,在使用完毕后需要用delete关键字释放内存,此时也同时执行析构函数~Entity

对于元素组的形式,我们的delete也要做对应改变,比如:

ini 复制代码
Entity* Gotei13 = new Entity[13]{ {} ,{"suifeng"},{"gin"}};
delete[] Gotei13;
        
int* a = new int[10];
for (int i = 0; i < 10; i++) {
	a[i] = i;
	printf("a[%d]: %d\n", i, a[i]);
}
delete[] a;

栈/堆的优劣势

相关推荐
Persistent的粽子!1 小时前
C++:类与对象(一)
开发语言·c++·经验分享·笔记
库玛西2 小时前
深入浅出Linux select网络模型:从底层位图原理到C++面向对象高级封装
linux·服务器·网络·c++·ubuntu
2402_882893862 小时前
深入浅出 unordered_map 与 unordered_set——从使用到底层差异
c++·哈希·unordered_map·unordered_set
今天要早睡_2 小时前
C++ 核心语法速过:命名空间、引用、函数重载与 nullptr 深度解析
android·java·c++
汉克老师3 小时前
CSP-J 初赛(以满分为目标):第二十七课 《图的遍历——BFS广度优先搜索——像“水波纹”一样,一层一层地搜索》
c++·csp-j·小学生·学c++编程
闻缺陷则喜何志丹3 小时前
【动态规划】P3609 [USACO17JAN] Hoof, Paper, Scissor G
c++·算法·动态规划·洛谷
汉克老师3 小时前
CSP-J 初赛(以满分为目标):第二十六课 《图的遍历——DFS深度优先搜索——从“树的先序遍历”走进真正的图世界》
c++·csp-j·小学生·学c++编程
程序猿编码3 小时前
基于GGML的C++17轻量化语音推理引擎:说话人识别与语音分析技术全解析
开发语言·c++·pytorch·深度学习·神经网络·大模型
影视飓风TIM4 小时前
C++哈希表深度剖析:冲突处理、rehash、迭代器与unordered容器封装
c++·哈希算法·散列表
C++ 老炮儿的技术栈4 小时前
Qt5 使用 QPainter 绘制阿基米德螺线
开发语言·c++·windows·qt·代码化