成员函数内部调用另一成员函数可直接写函数名,依赖隐式this机制;需注意const限定、静态函数无this、构造函数中初始化顺序等约束。

成员函数内部调用另一个成员函数,直接写函数名就行
不需要加 this-> 前缀,也不用通过对象实例——只要在同一个类的非静态成员函数里,被调用的函数是 public 或 protected(且可访问),编译器就能自动绑定到当前对象。这是 C++ 的隐式 this 机制决定的。
常见错误现象:error: 'xxx' was not declared in this scope,往往是因为拼错了函数名、大小写不一致,或者目标函数是 private 且调用方不在类内(比如在友元函数或外部代码里误以为能调)。
- 调用前确保函数已声明(头文件中已有原型,或定义顺序靠前)
- 如果被调函数是 const 成员函数,而调用方是非 const 函数,可以调;反过来则不行(const 函数不能修改状态,不能调用非 const 函数)
- 递归调用要小心栈溢出,尤其是没写终止条件时
跨 const 限定调用要注意权限匹配
const 成员函数只能调用其他 const 成员函数,否则编译失败。比如 void calc() const 里写 update_cache(),而 update_cache() 没有 const 后缀,就会报错:error: passing 'const MyClass' as 'this' argument discards qualifiers。
使用场景:常用于 getter、打印、校验等只读逻辑。若某个函数本意是只读,但内部不小心调用了会改状态的函数,编译器会立刻拦住你。
- 快速修复:给被调函数加上
const(前提是它真不改成员变量) - 若必须改状态,就别在 const 函数里调它——要么把调用方也改成非 const,要么拆出一个 const 版本的逻辑
- 注意 mutable 成员变量不受 const 限制,但仅限于极少数缓存/计数场景,别滥用
静态成员函数不能直接调用非静态成员函数
static 成员函数没有 this 指针,所以无法访问 this->xxx() 或隐式调用任何非静态成员函数。常见错误现象:error: invalid use of 'this' in static member function,或更直接的 error: cannot call non-static member function without an object。
性能影响:静态函数本身轻量,但强行绕过限制(比如传入对象指针再调)会破坏封装,还可能引入空指针风险。
- 如果逻辑确实和对象状态无关,把被调函数也改成
static - 如果需要对象数据,就别用
static调用方——改用普通成员函数,或让静态函数接收一个MyClass*参数 - 别用全局变量或单例来“补救”,那会让测试和复用变困难
构造函数里调成员函数要当心初始化顺序
可以在构造函数体里调用其他成员函数,但必须确保所访问的成员变量已经完成初始化。C++ 按声明顺序初始化成员,不是按构造函数初始化列表里的顺序。
容易踩的坑:在初始化列表还没跑完时,就在构造函数体内调用依赖某个成员的函数,结果该成员还是垃圾值。例如 m_data 在类里声明在 m_helper 后面,但初始化列表先写了 m_helper(init_data),这时 m_data 还没构造,init_helper() 却去读它,行为未定义。
- 优先把依赖关系强的初始化放进初始化列表,而不是构造函数体
- 构造函数里调用的函数,尽量避开尚未初始化的成员变量
- 如果必须在构造中做复杂逻辑,考虑用 factory 函数或两阶段初始化,别硬塞进构造函数
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











