为何成员函数值参数可加const,引用参数却不行?
问题解答
一、值参数的const不影响函数签名
对于值传递的参数(比如示例中的int),函数声明里的int和定义里的const int属于同一签名。因为值传递时,参数是原变量的独立副本,给值参数加const只是限制函数内部不能修改这个副本,不会改变函数的签名。C++标准里,这种"顶层const"不会参与函数签名的匹配,所以A::f(int)的声明和A::f(const int)的定义可以正常匹配,编译器不会报错。
二、引用参数的const会改变参数类型
引用参数的const属于"底层const",直接改变了参数的类型:
int&是对非const整数的引用,只能绑定到可修改的左值;const int&是对const整数的引用,可以绑定到左值、右值甚至const变量。
当你把声明的A::g(int&)定义成A::g(const int&)时,相当于定义了一个类中未声明的新函数,编译器会判定这是一个不匹配的函数定义,因此触发编译错误。
总结
- 顶层const(值参数的const)不影响函数签名,声明和定义可兼容;
- 底层const(引用/指针的const)会改变参数类型,声明和定义必须严格一致。
内容的提问来源于stack exchange,提问作者phinz
相关产品推荐
相关产品推荐

