常量如何使函数重载

How can const make a function overloads?

本文关键字:重载 函数 何使 常量      更新时间:2023-10-16

我用C++编写了这段代码:

class Foo
{
public:
    int& fun(){return var;}       // 1st fun
    int fun() const {return var;}  // 2rd fun
 private:
    int var;
};
int main()
{
    Foo foo;
    int i = foo.fun();
    return 0;
}

我知道C++不能通过返回值来区分重载函数,但是为什么当我在第二个函数中添加一个 const 时,重载可以工作?"康斯特"做了什么?

编译器无法区分返回类型,因为在执行赋值之前可以进行转换。另一方面,调用函数的对象是函数的参数(尽管是隐式参数),因此编译器可以区分它。

Const 的使用方式如下:

Foo inst1;
const Foo inst2;
inst1.fun();    // 1st fun
inst2.fun();    // 2nd fun

函数名称后的 const 引用隐式this参数。因此,对于 inst1,它将Foo*,对于 inst2 const Foo* .这将引导重载。

返回值不用于选择重载。不允许在同一层上使用具有相同参数集和不同类型的返回值的方法/函数。

对于它的价值,标准(§13.3.1/3,4)中的语言:

同样,在适当的时候,上下文可以构造一个包含隐含对象的参数列表 参数来表示要操作的对象。由于参数和参数在其各自的列表中按位置关联,因此约定是隐式对象参数(如果存在)是 始终是第一个参数,隐含对象参数(如果存在)始终是第一个参数。

对于非静态成员函数,隐式对象参数的类型为

— "对 cv X 的左值引用",用于声明没有 ref-qualifier 或带有 & ref-qualifier 的函数

— "对 cv X 的右值引用",用于使用 &&ref-限定符声明的函数 其中 X 是函数所属的类,cv 是成员函数声明的 cv 限定。[ 示例:对于类 X 的常量成员函数,假定额外参数的类型为"对常量 X 的引用"。