繁体   English   中英

Operator ++:引用vs值返回和未使用的参数

[英]Operator++: reference vs value return and unused argument

我看到这个C ++代码是一个更大的例子的一部分:

Date &Date::operator++()
{
    helpIncrement();
    return *this;
}

Date Date::operator++( int )
{
    Date temp = *this;
    helpIncrement();
    return temp;
}

首先,如果Date temp = *this ,那么我不明白为什么返回类型对于这两个函数有什么不同? 一个返回*this ,另一个返回temp ,它被分配给*this

其次,为什么第二个函数的参数没有变量名?

第一个返回this指向的对象作为引用。 也就是说,返回的对象调用operator++的对象。 但是,当你执行Date temp = *thistemp是从*this的值构造的。 然后将其复制出函数。 你从第二个函数得到的是一个全新的对象。 为什么函数有这种差异在第二个问题的答案中解释。

有两种类型的递增运算符 - 一种是后递增( i++ ),另一种是预递增( ++i )。 为了能够单独重载它们(尽管它们具有相同的名称, operator++ ),C ++标准指定后增量运算符采用int类型的参数和未指定的值。 这很简单,您可以为操作员的每次使用重载该功能。 由于您不太可能想要使用未指定的值,因此您可以将其保留为未命名。

现在,预增量运算符的预期行为是它递增对象并评估为该对象。 这就是它在这种情况下返回引用的原因。 后增量的预期行为是它保留原始值的副本,递增对象然后返回原始值。 因此,它返回temp副本。

这是一个很好的问题 - 它突出了C ++设计师采用的一种相当愚蠢的设计选择:

  • 没有参数的重载是预先递增的; 带有未使用的 int参数的重载是后增量。
  • 这就是为什么预增量版本可以返回引用,而后增量必须在增加值本身之前复制原始版本。
  • 添加int参数的原因有一个 - 区分两个重载; 它没有任何意义,这就是为什么它的价值永远不会被使用的原因。

第一个运算符是预递增:它递增值,并返回结果。 第二个是后增量:它递增值,并返回先前的值。 在该代码中, temp保存先前的值, helpIncrement()递增该值,并返回先前的值( temp )。 参数没有名称的原因是它没有被使用。 这有点像黑客; 编译器知道++my_value应该被翻译成my_value.operator++() ,并且my_value++应该被翻译成my_value.operator++(1) 也就是说,缺少或存在积分参数决定了要调用的过载。

  1. 第一个函数在递增后返回对此的引用。 第二个在递增之前返回此副本。

  2. 第二个函数中未使用的参数区分++运算符的前缀(无参数)和后缀(单个int参数)版本。

这是一个基本主题,请阅读有关重载operator++ 你可以从这里开始: 运算符重载

首先,如果Date temp = * this,那么我不明白为什么返回类型对于这两个函数有什么不同?

让我们将这与旧的int上的++的情况进行比较。 考虑

int i = 1;
int j = i++;

在此之后, j保持i的旧值,但是i自己增加了。 所以, i必须已经先于增量复制,仿佛++int被定义为

class int { // pseudocode
  public:
    int operator++(int)
    {
        int temp = *this;
        *this += 1;
        return temp;
    }
};

OTOH,之后

int i = 1;
int j = ++i;

ij具有相同的值,因此++必须实现为

int &operator()
{
    *this += 1;
    return *this;
}

int更改为int&引入便利的地方:不需要复制,并且在需要引用的情况下可以使用++i

其次,为什么第二个函数的参数没有变量名?

因为它永远不应该被使用。 这个参数是作为一个语法噱头,所以编译器可以区分两种类型的operator++ (前后增量),但它没有任何明确定义的值。 赋予其名称将在编译器中触发“未使用的标识符”选项并启用适当的警告。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM