成员函数需声明与定义分离:头文件中声明,源文件中定义;const成员函数必须写在参数列表后;静态成员函数无this指针,静态数据成员需在类外定义。

成员函数的声明和定义不是“写在哪都行”,而是有明确分工和约束:声明告诉编译器“这个函数存在、长什么样”,定义提供“它具体怎么干活”。错放位置或混用会导致链接错误、重复定义或无法调用。
类内声明 + 类外定义是最常用且推荐的写法
头文件(如 Widget.h)中只放声明,源文件(如 Widget.cpp)中放定义。这样能避免头文件被多次包含时引发的重定义问题,也利于编译分离和接口封装。
常见错误现象:error LNK2005: xxx already defined 或 undefined reference to 'Widget::setValue(int)'
- 类内只写函数签名,不带函数体,末尾不加分号(C++11 起允许带默认参数)
- 类外定义必须用作用域解析符
::明确归属,如void Widget::setValue(int v) { ... } - 如果函数体太短(比如只有一行 return),直接在类内写实现,它会自动成为
inline函数,无需手动加inline关键字 - 类内定义的函数默认 inline,但不要因此把所有函数都塞进类体内——逻辑复杂、调用频繁但体积大的函数放类外更利于调试和二进制大小控制
const 成员函数必须显式标注 const 位置
const 是函数类型的一部分,不是可选修饰。漏写或写错位置(比如写在返回类型前)会导致重载失败、const 对象无法调用,甚至静默调用错误版本。
立即学习“C++免费学习笔记(深入)”;
使用场景:读取状态、返回引用、作为哈希/比较函数的组成部分
- 正确写法是紧贴参数列表后、函数体前:
int getValue() const;或int getValue() const { return value; } - 错误写法:
const int getValue();(这是返回 const int,不是 const 成员函数) - const 成员函数里不能修改非
mutable的成员变量,也不能调用非 const 成员函数 - 同一个函数名,
void display();和void display() const;是两个独立函数,可共存并构成重载
静态成员函数只能访问静态成员
静态成员函数没有 this 指针,所以它既不能访问非静态成员变量,也不能调用非静态成员函数。把它当成“借了类名的全局函数”来理解更准确。
典型用途:工厂方法、获取类级计数器、配合 std::make_shared 等需要独立于对象生命周期的操作
- 声明写在类内:
static Widget* create(); - 定义写在类外,**不加
static关键字**:Widget* Widget::create() { return new Widget; } - 静态成员变量必须在类外单独定义一次(哪怕有默认值),否则链接时报
undefined reference - 静态成员函数可以是
const,但这没意义——因为本来就不能改任何成员,加不加const效果一样
最容易被忽略的是:类内声明的静态数据成员(如 static int count;)只是声明,不是定义;必须在某个 .cpp 文件里写一行 int Widget::count = 0; 才算真正定义。漏掉这一步,链接阶段必崩。


















