是否可以通过const说明符重载函数。也就是说,我们有两个函数,一个是常量而另一个不是,我们可以说常量函数重载了非const函数吗?
答案 0 :(得分:4)
是和否。
这取决于您放置const
说明符的位置。
在定义成员函数时,这是可能的(是 - 部分):
int f() { /*code*/ } //invoke this function on non-const object
int f() const { /*code*/ } //ok : invoke this function on const object
请注意,在没有第一个函数的情况下,即使非const对象也将调用第二个函数(即const
成员函数)并且在没有第二个函数的情况下函数,您将无法调用const
对象上的第一个函数!
但这不可能(非部分):
int g() { /*code*/ }
const int g() { /*code*/ } //error: redefinition
无论他们是成员函数还是自由函数。
答案 1 :(得分:1)
Per§13.1/ 2:
无法将const
置于return-type中以重载:
不能仅在返回类型上有所不同的函数声明 超载。
int func();
const int func(); // Error
无法将const
置于参数列表中以进行重载:
参数声明仅在存在或不存在时有所不同 const和/或volatile是等价的。
void func(int x);
void func(const int x); // Error
但是,有可能:
const和volatile类型说明符隐藏在参数类型中 规范是重要的,可用于区分 重载函数声明。
void func(int &x);
void func(const int &x); // OK
并且,可以将const
放在方法声明的末尾以区分重载:
int func();
int func() const; // OK