真实面经题目 · 原创解析

const function(const) const 中三个 const 分别有什么区别?

const function(const) const 这类题考的是 const 出现在返回值、参数和成员函数尾部时的不同约束。回答要把修饰对象说清楚,而不是笼统说都是不可变。

出现于:拼多多 · C/C++

60 秒回答模板

可以按 const 修饰谁来拆。函数名前面的 const 如果修饰返回值,表示返回结果是常量,通常对值返回意义不大,对返回引用或指针才更有约束。参数里的 const 表示函数内部不能修改该参数指向或引用的对象,常见写法是 const T&,避免拷贝又保证不改入参。成员函数末尾的 const 表示这个成员函数不会修改对象的可观察状态,函数内部的 this 类型相当于 const Class*,因此不能调用非 const 成员函数,也不能改普通成员变量。

考点 返回值 const
难度 真实面经题
回答目标 讲清方法、取舍和追问

深入解析

01

先看返回值 const

如果函数返回值前有 const,要判断返回的是值、引用还是指针。const 值返回通常收益有限;const 引用返回可以防止调用方修改被引用对象;指针场景还要区分指针本身常量和指向对象常量。

02

再看参数 const

参数 const 表示函数承诺不修改入参。对基础类型值传递意义不大,因为本来就是副本;对引用、指针和大对象更重要,能减少拷贝并表达只读语义。

03

最后看尾部 const

成员函数参数列表后的 const 修饰隐式 this 指针,表示该函数不会修改当前对象的普通成员。它是接口承诺,也是 const 对象只能调用 const 成员函数的原因。

04

区分指针写法

const T* 表示不能通过指针改 T,T* const 表示指针变量本身不能改指向,const T* const 表示指向和内容都不能通过该指针改。这类写法常被合并追问。

05

理解 mutable 例外

尾部 const 限制可观察状态,但 mutable 成员仍可在 const 成员函数中修改,常用于缓存、懒加载或统计计数。使用时要保证不破坏对象语义。

易错点

  • 不要笼统说 const 都是变量不可变,要说明它修饰的是返回值、参数、指针还是 this。
  • 不要把 const T* 和 T* const 说反。
  • 不要忽略尾部 const 只用于非静态成员函数。
  • 不要说 const 成员函数绝对不能改任何东西,mutable 是明确例外。

面试官追问

const 成员函数里能不能改成员变量?

普通成员变量不能改,因为 this 是指向 const 对象的指针;mutable 成员可以改,但应只用于缓存等不影响逻辑状态的字段。

const T* 和 T* const 有什么区别?

const T* 是指向常量 T 的指针,不能通过它改 T;T* const 是常量指针,不能改指向,但可以改它指向的 T。

为什么 const T& 常用于函数参数?

它避免大对象拷贝,同时承诺函数不会修改实参,兼顾性能和接口语义。