可以通过常量说明符重载函数。也就是说,我们有两个函数,一个常数另一个不是,我们可以说常量函数重载了非常量函数吗?
是和否。
这取决于您放置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
无论它们是成员函数还是自由函数。
根据 § 13.1/2:
不可能将const
置于返回类型以重载:
仅在返回类型上不同的函数声明不能 重载。
int func();
const int func(); // Error
无法将const
放入参数列表中以重载:
参数声明仅在存在或不存在 常量和/或易失性是等效的。
void func(int x);
void func(const int x); // Error
但是,有可能:
隐藏在参数类型中的常量和易失性类型说明符 规格很重要,可用于区分 重载函数声明。
void func(int &x);
void func(const int &x); // OK
而且,可以将const
放在方法声明的末尾以区分重载:
int func();
int func() const; // OK