【问题标题】:How can const make a function overloads?const 如何使函数重载?
【发布时间】:2012-08-11 02:02:07
【问题描述】:

我用 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' 做了什么?

【问题讨论】:

    标签: c++ constants overloading


    【解决方案1】:

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

    【讨论】:

    • 我得出这样的结论:函数名后面的 const 暗示隐含对象(aka.'this')参数是 const ,所以这两个函数之间的参数实际上是不同的,这使得重载有效。是吗真的吗?
    【解决方案2】:

    常量的使用方式如下:

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

    函数名后面的常量指的是隐含的this参数。因此,对于 inst1,它将 Foo* 和对于 inst2 const Foo*。这将引导过载。

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

    【讨论】:

      【解决方案3】:

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

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

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

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

      —“对 cv X 的右值引用”,用于使用 && ref-qualifier 声明的函数 其中 X 是函数所属的类,cv 是成员函数声明上的 cv 限定。 [ 示例:对于类 X 的 const 成员函数,假定额外参数的类型为“对 const X 的引用”。 ——结束示例]

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多