C++对象模型一图通:this / static / const / inline 全部讲透

张开发
2026/4/8 20:22:51 15 分钟阅读

分享文章

C++对象模型一图通:this / static / const / inline 全部讲透
一、为什么要搞懂这一套很多人学 C 会出现一个问题 语法会写但底层逻辑是散的比如为什么 static 要类外定义const 到底修饰了什么this 是怎么来的inline 为什么能解决多重定义 如果不串起来这些知识点就是“碎片” 本文目标 用一张模型把这些全部串起来工程版理解二、C对象模型总图核心类class ↓ 对象object ↓ 成员函数调用 ┌──────────────────────────────┐ │ 成员函数本质 │ │ func(A* this, 参数...) │ └──────────────────────────────┘ ┌──────────────┬──────────────┐ │ │ 普通成员函数 static函数 有this 没有this │ │ this → A* 无 this 指针 │ const函数 this → const A*三、this 指针核心基础 本质 成员函数 ≈ 普通函数 一个隐藏参数 this示例class A { public: int x; void set(int v) { x v; } }; 实际等价void set(A* this, int v) { this-x v; }结论 this 当前对象的指针类型 A*四、const 修饰 this关键写法void func() const;本质void func(const A* this);结论this 变成const A*不能修改成员变量可以被 const 对象调用五、static 成员类级别① static 函数static void func(); 特点属于类不属于对象没有 this 指针结论 static函数 没有 this 的普通函数② static 变量重点class A { public: static int x; // 声明 }; int A::x 10; // 定义分配内存规则类内声明类外定义必须初始化在定义时进行可选本质 static变量 类作用域的全局变量全局唯一一份补一张“共享模型”你可以照这个手画A a1, a2, a3 a1 ─┐ a2 ─┼──→ static x唯一一份 a3 ─┘六、为什么必须类外定义 核心原因 避免多重定义ODROne Definition Rule场景// A.h class A { public: static int x; };被多个 .cpp 引用#include A.h 如果类内直接定义假设允许static int x 10; // ❌ 会变成main.cpp → 一份 x test.cpp → 一份 x❌ 链接错误重复定义所以 必须int A::x 10; 只定义一次七、inlineC17关键class A { public: inline static int x 10; };作用可以在类内直接定义不需要类外再写自动解决“多重定义问题”本质非常重要 inline 允许多处定义但链接时只保留一份八、A* 是什么 A* 指向 A 类型对象的指针示例A a; A* p a; 含义p 存的是对象地址编译器知道这是 A 类型关键点 指针 地址 类型信息九、最终统一模型最重要1. 成员函数本质 func(A* this) 2. const函数 func(const A* this) 3. static函数 func() // 没有this 4. static变量 类内声明 类外定义唯一实例 5. inline 解决多重定义链接去重 6. A* 指向对象的指针带类型十、一句话终极总结 C成员函数本质 带 this 的普通函数 static 去掉 this const 限制 this inline 解决链接重复定义十一、写在最后工程视角这一套知识的本质不是语法而是对象模型this内存模型static编译/链接模型inline / ODR 当你把这三层串起来 C就不再是“难”而是“清晰”

更多文章