对象是c++中具有明确生命周期、独立状态和行为响应能力的内存实体,对应运行时真实内存,其构造与析构顺序直接影响资源安全。

对象不是语法糖,也不是可有可无的包装——它是C++里一块**有明确生命周期、有独立状态、能响应行为调用的内存实体**。
对象是运行时分配的一块具体内存
类只是编译期的模板,不占运行时空间;而对象一旦创建,就对应一段真实内存。这段内存里既存数据(成员变量),也隐含类型信息(用于虚函数表、dynamic_cast等)。
- 栈上对象:
Person p{"Alice", 28};—— 函数返回即自动析构,内存由栈帧管理 - 堆上对象:
Person* p = new Person{"Bob", 32};—— 必须显式delete p;,否则泄漏 - 静态存储期对象:
static Person s{"Charlie", 40};—— 程序启动时构造,结束时析构
对象的状态和行为必须绑定在同一个实例上
不能把“张三的年龄”和“李四的姓名”混在一起操作——每个对象维护自己的一套成员变量副本。哪怕两个对象类型相同、值相同,它们在内存中也是彼此隔离的。
- 错误写法:
p1.name = p2.age;—— 类型不匹配,编译报错 - 正确逻辑:
p1.setAge(p2.getAge());—— 通过接口传递,保持封装 - 关键点:成员函数内部的
this指针永远指向“当前正在调用它的那个对象”的地址
对象的构造/析构顺序直接影响资源安全
对象不是“一建了之”,它的诞生(构造)和消亡(析构)是受控过程。尤其涉及文件句柄、锁、动态内存时,顺序错一点,就会出 double free 或 use-after-free。
- 派生类对象:先调基类构造 → 再调派生类构造;析构则反过来
- 成员对象:按声明顺序构造,逆序析构(和继承顺序无关)
- 全局对象:不同编译单元间初始化顺序未定义,避免跨单元依赖
最容易被忽略的是:对象的“存在”不等于“可用”。比如一个刚 new 出来的对象,如果构造函数抛异常,那它根本没完成构造——这块内存不会被析构,也不会被回收,而是直接泄露。这时候你手里拿的 Person* 是个悬空指针。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











