【问题标题】:Overloading a function by return type?通过返回类型重载函数?
【发布时间】:2022-01-13 00:03:33
【问题描述】:

关于 SO 的最受欢迎的问题之一是处理各种运算符重载的问题。关于括号运算符operator[] 的重载,我有些不明白。我的问题是关于以下代码:

class X {
        value_type& operator[](index_type idx);
  const value_type& operator[](index_type idx) const;
  // ...
};

这里操作符被重载了两次,一个允许改变成员的函数,一个不允许改变成员。我读到 c++ 不允许按返回类型重载函数,但这看起来像。 T& 更改为 const T&。有人可以向我解释一下这种“重载”到底是什么,为什么会这样?

提前致谢。

PS:如果这是因为第二个 const 关键字将“不可见”this 指针参数更改为 const this 而有效,那么我理解,但仍然有这种做法的名称吗?

【问题讨论】:

  • 给定一个定义为X a 的对象,a[idx] 将调用不是const 限定的operator[]()。但是对于定义为const X b 的对象,b[idx] 将调用operator[](),即const 合格。是的,在非const 版本中,this 具有 X * const 类型(这会阻止直接分配给 this,但允许更改对象 this 指向)并且在 const 版本中 this 具有类型X const * const.

标签: c++ oop operator-overloading


【解决方案1】:

要使重载起作用,函数需要具有不同的签名(返回类型不计算在内)。

在方法中,指向对象的this 指针也算作隐式(第一个)参数。静态方法当然没有this 指针,因此可以将它们视为全局函数。

在您的示例中,这两种方法具有不同的参数。 idx 在这两种情况下都是相同的,但第一种方法有一个 this 类型的指针 X*,它是一个变量指针。在第二种方法中,this 指针是一个常量类型:const X*,因此与第一种方法不同,这就是重载起作用的原因。

返回值与重载无关。如果只是返回值不同,编译器就不会允许重载。

class X {
        value_type& operator[](index_type idx);
  const value_type& operator[](index_type idx) const;
                     // -----------------------^^^^^
                     // This is what makes the overloading possible.
};

【讨论】:

    猜你喜欢
    • 2013-03-22
    • 1970-01-01
    • 2013-07-29
    • 1970-01-01
    • 1970-01-01
    • 2014-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多