可以通过常量说明符重载功能


是否

可以通过常量说明符重载函数。也就是说,我们有两个函数,一个常数另一个不是,我们可以说常量函数重载了非常量函数吗?

是和否。

这取决于您放置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

最新更新