为何代码中调用的是int* Get()而非const int& Get()?
问题分析与解决
你遇到的问题核心是C++成员函数重载决议的优先级规则,咱们一步步拆解清楚:
为什么会出现编译错误?
你的类B里有两个Get重载:
- 非const成员函数:
int* Get()—— 供非const对象调用,返回x_的指针 - const成员函数:
const int & Get() const—— 供const对象调用,返回x_的const引用
而main里的b是非const的B对象,当你调用b.Get()时,编译器会优先选择非const版本的Get函数(因为非const对象可以调用两种重载,但非const版本更贴合对象的可修改属性)。
这就导致:
const int& refval2 = b.Get();实际上是把int*(非constGet的返回值)赋值给const int&,指针和int类型完全不匹配,直接触发编译错误。- 第二个赋值
int* pval2 = b.Get();本身是没问题的,它正确匹配了非const的Get,但第一个语句的类型不匹配拖了后腿。
怎么解决?
如果你想让非const对象调用const版本的Get,需要明确告诉编译器要匹配const重载,有两种常用的规范方式:
方式1:将对象转换为const引用
把普通对象转换成const引用后,调用Get就会自动匹配const版本:
#include <iostream> class B{ public: int* Get(){ return &x_; } const int & Get() const{ return x_; } private: int x_ = 0; }; int main(){ B b; // 把b转换成const引用,强制触发const版本的Get调用 const B& cb = b; const int& refval2 = cb.Get(); // 现在匹配const Get,正常编译 int* pval2 = b.Get(); // 匹配非const Get,正常编译 }
方式2:使用const_cast强制转换对象(不推荐,除非必要)
可以直接用const_cast把对象转成const类型,不过这种写法可读性较差,尽量在特殊场景下才用:
const int& refval2 = const_cast<const B&>(b).Get();
额外补充:重载决议的关键规则
记住C++的这个核心规则:
- 非const对象调用重载函数时,优先选择非const成员函数
- const对象(或const引用/指针)调用时,只能选择const成员函数
搞清楚这个逻辑,就能避免类似的重载匹配错误啦。
内容的提问来源于stack exchange,提问作者mato
相关产品推荐
相关产品推荐

