【问题标题】:Const and Non-Const Operator Overloading常量和非常量运算符重载
【发布时间】:2013-10-14 18:26:44
【问题描述】:

我有一个我很困惑的话题,我需要详细说明一下。它是一个 const 版本和一个非常量版本的运算符重载。

// non-const
double &operator[](int idx) {
    if (idx < length && idx >= 0) {
        return data[idx];
    }
    throw BoundsError();
}

我知道这个 lambda 函数接受一个索引并检查其有效性,然后返回类中数组数据的索引。还有一个函数具有相同的主体但函数调用为

const double &operator[](int idx) const

为什么我们需要两个版本?

例如,在下面的示例代码中,下面每个实例中使用的是哪个版本?

Array a(3);
a[0] = 2.0;
a[1] = 3.3;
a[2] = a[0] + a[1];

我的假设是 const 版本仅在 a[2] 上调用,因为我们不想冒险修改 a[0]a[1]

感谢您的帮助。

【问题讨论】:

  • 你可以很容易地检查其中的输出调用了哪个。
  • 它在演讲幻灯片中,所以我希望我不必创建一个类来使用它们,而只是有人帮助我理解我们为什么这样做
  • 别偷懒,自己试一试,你会记得更清楚。
  • 我假设 const 版本仅在 a[2] 上调用,因为我们不想冒险修改 a[0]a[1] 这没有任何意义,操作a[2] 不涉及a[0]a[1],它涉及a 和整数文字2
  • 我发现这个视频很有帮助:youtube.com/watch?v=4fJBrditnJU。直接跳到 8:15

标签: c++ operator-overloading constants


【解决方案1】:

当两个版本都可用时,逻辑非常简单:const 版本为const 对象调用,非const 版本为非const 对象调用。就是这样。

在您的代码示例中,a 是一个非const 对象,这意味着在所有情况下都会调用非const 版本。 const 版本从不在您的示例中调用。

拥有两个版本的要点是对非const 对象实现“读/写”访问,而对const 对象仅实现“读”访问。对于const 对象,const 版本的operator [] 被调用,它返回一个const double &amp; 引用。您可以通过该 const 引用读取数据,但不能通过它进行写入。

【讨论】:

  • 我不知道——我发现很难调用非常量版本。请看这个现场演示:coliru.stacked-crooked.com/a/1c820d80113bc9e3
  • @Reb.Cabin:在您的演示中,您从不尝试调用非 const 版本的 operator[]。每次你有这样的机会,你都会改用this-&gt;elems[i]。请注意,this-&gt;elems 是一个普通的原始指针。它的运算符[] 是普通的内置 索引器,而不是您的重载索引器。如果你想调用重载的非常量版本的operator [],你必须在赋值左侧使用(*this)[i],而不是this-&gt;elems[i]
  • 我明白了。我重写了ctor和一个更好的例子来使用非常量索引器。有用的,澄清的评论。 coliru.stacked-crooked.com/a/3a2e3960c1e77d78
  • @AnT 在关系运算符重载的情况下,我们应该提供两者还是只提供一个就足够了?在这种情况下,我们应该使用哪一个。例如。 bool operator&lt;(const Type &amp;t) constbool operator&lt;(const Type &amp;t) 更好?
【解决方案2】:

提供一个代码示例来补充上面的答案:

Array a(3);
a[0] = 2.0;  //non-const version called on non-const 'a' object

const Array b(3);
double var = b[1];  //const version called on const 'b' object

const Array c(3);
c[0] = 2.0;  //compile error, cannot modify const object

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-28
    • 2018-09-03
    相关资源
    最近更新 更多