[英]Purpose of Dummy Parameter in Postfix Operator Overload? c++
重载后缀运算符时,我可以做一些简单的事情,例如
Class Foo
{
private:
int someBS;
public:
//declaration of pre &postfix++
Foo operator++();
//rest of class not shown
};
前缀不需要带任何参数,所以当我定义它时,就像
Foo Foo::operator()
{
someBS ++;
return *this;
}
这对我来说很有意义。
当我去定义后缀重载时,我必须包含一个虚拟的 int 参数
Foo Foo::operator++(int)
{
Foo temp = *this;
someBS ++;
return temp;
}
我的问题是为什么? 我从来没有在方法中使用它。 前缀运算符不需要一个。 返回temp
值的后缀不依赖于虚拟参数。 我知道如果我想重载一个后缀操作符就是这样做的,我只想知道背后的原因。
虚拟参数只是为了区分后缀和前缀运算符。 名称++
或--
在两种情况下都是相同的,因此必须有某种方法来指定您要定义的名称。 添加一个虚拟参数可能并不优雅,但任何替代方案都可能需要发明新的语法(可能是一个postfix
关键字,它会破坏使用postfix
作为标识符的代码)。
在此处引用C++ 参考:
内置运算符的前缀版本返回引用,后缀版本返回值,典型的用户定义重载遵循该模式,以便用户定义运算符可以以与内置运算符相同的方式使用。
从逻辑上解释这一点:
int a = 3;
int b = 0;
int c = a + ++b;
int d = a++ + b;
在第三行中, ++b
为您提供了对更新值的引用; 在第四行中,这是不可能的: a
必须增加,因此创建了一个值副本,并将其添加到b
。 这决定了运算符的不同语义。
事实上,只是为了避免使用另一个操作符名称:
int 参数是一个虚拟参数,用于区分运算符的前缀和后缀版本。 当调用用户定义的后缀运算符时,该参数中传递的值始终为零,尽管可以通过使用函数调用符号(例如,a.operator++(2) 或 operator++(a, 2))调用运算符来更改它.
引用cppreference :
int 参数是一个虚拟参数,用于区分运算符的前缀和后缀版本。
引言说明了一切,因为您还如何区分前缀和后缀?
假设您不需要int
参数,那么前缀( Foo operator++()
)和后缀( Foo operator++()
)将完全相同! 编译器怎么知道你指的是哪一个? 这就是为什么有这个虚拟int
参数的原因。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.