类是抽象模板,不占内存;对象是具体实例,占用堆或栈空间。类名是自定义类型(如Student),对象名是变量(如p1),前者登记于类型符号表,后者登记于变量符号表。

类名是类型,对象名是变量——这是最直接、最不会出错的理解方式。类名不占内存,对象名才实际分配空间。
类名是用户自定义的数据类型
类名(比如 Student、Point)本质上和 int、double 一样,是编译器认识的一种类型。它本身不占用运行时内存,只是告诉编译器“以后遇到这个标识符,就按这个结构布局去理解数据”。
- 类定义必须以分号结尾:
class Student { ... };,漏掉分号是常见编译错误 - 类体内部没写访问限定符时,默认所有成员都是
private,这点和struct不同(struct默认public) - 类名首字母大写是行业惯例,不是语法要求,但能快速区分类型与变量
对象名是该类型的实例变量
对象名(比如 p1、st)是真实存在于栈或堆上的变量,有确定的内存地址和大小。空类的 sizeof 是 1,就是为了保证每个对象都有唯一地址。
- 栈对象写法:
Student p1;—— 生命周期由作用域控制,自动析构 - 堆对象写法:
Student* p = new Student;—— 必须配对delete p;,否则内存泄漏 - 对象名不能和类名同名(比如
class Point { ... }; Point Point;),虽然语法可能通过,但极易引发歧义和编译器困惑
类名和对象名在符号表里地位完全不同
编译器把类名登记在“类型符号表”,把对象名登记在“变量符号表”。这意味着:
立即学习“C++免费学习笔记(深入)”;
- 你不能对类名取地址:
&Student是非法的;但可以对对象取地址:&p1合法 - 函数参数里写
void func(Student s)是值传递(拷贝构造);写void func(const Student& s)才是引用传参,避免不必要的拷贝 - 模板推导时,
std::vector<student></student>里的Student是类型,而v[0]返回的是Student&或Student对象(取决于 const 性)
最容易被忽略的一点:类名可以重载(通过模板特化、别名等),但对象名一旦定义就不能在同一作用域重复;而类名哪怕在不同命名空间里重复,只要不冲突,编译器也能区分。这说明类名本质是“命名空间内的类型声明”,对象名才是“作用域内的实体绑定”。


















