2016-04-23 45 views
3

在重载后缀运算符,我可以做一些简单的像后缀运算符过载中虚拟参数的用途? 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操作符,它是如何完成的,我只想知道背后的原因。

+1

你会提出什么替代方法? –

+0

@AlanStokes,没有其他办法。鉴于我不确定其目的,我当然没有办法以不同的方式做。 – Podo

+1

@AlanStokes,'Foo ++运算符()'和'Foo运算符++()'怎么样? ;) (只有5%严重...) – kloffy

回答

5

虚拟参数只是为了区分后缀和前缀运算符。名称++--在这两种情况下都是相同的,所以必须有一些方式来指定您正在定义哪一个。添加一个虚拟参数可能并不优雅,但任何替代方案都可能需要发明新的语法(可能是postfix关键字,这会破坏使用postfix作为标识符的代码)。

+0

那么当我去调用带有类对象的方法时,可以说类似“Foo lilBunny;”的内容,如果我想对它使用后缀,那么我会在参数中包含什么值?垃圾?如果它是虚构的,必须通过某些东西,但是因为它通过了我们无关紧要的事情? – Podo

+1

@JeffreyDilley:你什么都不通过。你只是说'lilBunny ++;' - 编译器通过将'++'放在变量名后面而不是之前,来确定你想要的是后缀版本。 –

1

引述cppreference

的int参数是使用运营商的前缀和后缀的版本来区分虚拟参数。

引用说明了一切,因为如何区分前缀和后缀?

让我们只说,你不需要int参数,那么前缀(Foo operator++())和后缀(Foo operator++())是完全一样的!编译器如何知道你的意思?这就是为什么有这个虚拟int参数。

1

援引C++reference这里:

内置运营商的前缀版本返回引用和后缀版本返回值,和典型的用户定义的重载遵循的模式,使用户定义的运算符可以用在与内置插件相同的方式。

解释这个逻辑:

int a = 3; 
int b = 0; 

int c = a + ++b; 
int d = a++ + b; 

在第三行,++b为您提供了更新值的参照;在第四行中,这是不可能的:a必须增加,因此创建了一个值复制,并将其添加到b。这决定了操作员的不同语义。

其实,只是为了避免另一家运营商名称:

的int参数是使用运营商的前缀和后缀的版本来区分虚拟参数。当调用用户定义的postfix运算符时,该参数中传递的值始终为零,尽管可以通过使用函数调用符号(例如a.operator ++(2)或operator ++(a,2))调用运算符来更改该值。 。