类是模板,对象是实例;类不占内存,仅定义结构,对象才占用实际内存并拥有独立成员变量副本。

类和对象不是同一层级的概念,不能直接“比较区别”——类是模板,对象是用这个模板造出来的具体实例。
类是类型定义,不是内存实体
类(class)本身不占内存,它只是一份蓝图:描述有哪些成员变量、哪些成员函数、哪些能被外部访问(public/private)、怎么初始化(构造函数)等。编译器看到 class Date { int _year; void Print(); };,只是记下这个结构,并不会分配空间。
常见误解是把类当成“东西”,其实它更像 int 这种内置类型名——你写 int 不会生成整数,只有写 int x = 5; 才真产生一个值。
- 类定义末尾的分号
;必须写,否则编译报错(语法错误,不是逻辑问题) - 类内未加访问限定符的成员,默认是
private;而struct默认是public,这是关键差异点 - 类可以不含任何成员(空类),此时
sizeof仍为 1(避免地址重叠)
对象是类的实例,占用实际内存
对象(如 Date d1; 或 Date d2(2025, 10, 12);)才是运行时真实存在的东西,有确定的地址、可读写的成员变量、可调用的成员函数。
每个对象都独立保存自己的成员变量副本:d1._year 和 d2._year 是两块不同内存,改一个不影响另一个。
- 对象创建时自动调用构造函数(哪怕没显式写,编译器也会合成默认的)
- 对象生命周期结束时自动调用析构函数(用于清理资源,比如释放
new出来的内存) - 对象大小由其非静态成员变量决定,跟成员函数无关(函数代码存在代码段,不随对象复制)
为什么总有人混淆“类”和“对象”?
因为 C++ 允许在类定义内部直接写成员函数实现(如 void Print() { cout ),看起来像“类自己在干活”。但实际执行时,所有成员函数都隐式接收一个 <code>this 指针——它指向**当前正在操作的那个对象**。
也就是说,d1.Print() 和 d2.Print() 调用的是同一份函数代码,但 this 分别指向 d1 和 d2 的内存起始地址,所以读到的 _year 值不同。
- 如果你忘了加
this->(或依赖编译器自动补),又恰巧参数名和成员变量同名(如void SetYear(int year) { year = year; }),就会赋值失败——这是新手最常踩的坑 - 静态成员变量属于类,不属于某个对象;静态成员函数没有
this指针,不能直接访问非静态成员
真正容易被忽略的点是:类的定义可以出现在头文件里反复包含(只要不违反 ODR),但对象的定义必须唯一。全局对象、static 局部对象、new 出来的对象,它们的生命周期管理方式完全不同——这里出错往往不报编译错误,而是运行时崩溃或内存泄漏。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











