之前的文章理解了#include和namespace,当读到源码13行的时候,懵了,这句代码是什么意思,如果是创建对象的话为什么没有new,如果是申明变量的话为什么没有变量名和等于号

1. C++对象创建语法分析
arduino
// Canvas canvas("Helpers"); 的语法结构:
// ┌─────────┐ ┌──────┐ ┌───────────┐
// │ Canvas │ │canvas│ │("Helpers")│
// │ 类型 │ │变量名│ │构造函数参数│
// └─────────┘ └──────┘ └───────────┘
// 这确实是创建对象,也确实是声明变量
//
// 这相当于JavaScript中的: const canvas = new Canvas("Helpers");
为什么没有 new?
- 在C++中,new 是用于堆上创建对象的
- Canvas canvas("Helpers"); 是栈上创建对象(更常用,自动管理内存)
- 相当于JavaScript中的自动垃圾回收
为什么没有等号?
- 这是C++的直接初始化语法,更高效
- 等价写法:Canvas canvas = Canvas("Helpers"); (但效率较低)
- C++编译器会直接调用构造函数,不需要等号
变量名在哪里?
- canvas 就是变量名!
- C++不需要 var/let/const 关键字
- 类型名(Canvas)已经说明了变量的性质
2. C++有两种创建对象的方式
方式1:栈上创建(自动内存管理)
cppp
Canvas canvas("Helpers");
方式2:堆上创建(需要手动管理内存)
cpp
Canvas* canvas = new Canvas("Helpers"); // 需要后续调用 delete canvas;
JavaScript: 所有对象都在堆上,但有垃圾回收器自动管理
js
const canvas = new Canvas("Helpers"); // 堆上创建 + 自动垃圾回收
3. JavaScript vs C++ 对象创建方式
css
// JavaScript: C++:
// ───────────────────────────── ─────────────────────────────
// const canvas = new Canvas(); Canvas canvas; // 默认构造
// const canvas = new Canvas(x); Canvas canvas(x); // 带参数构造 ←当前使用
// const canvas = new Canvas(x); Canvas canvas{x}; // 列表初始化
// const canvas = new Canvas(x); Canvas* canvas = new Canvas(x); // 堆上创建