overload ++
函数必须以int
为参数才能将自己与前缀运算符区分开来,这是某种强制规则吗?
另外,在前缀overload ++
函数的情况下,右手操作数是如何隐式参数的?
E.g ++ClassObj //ClassObj is rhs, but usualy lhs is made implicit
答案 0 :(得分:6)
关于第二个问题。前缀和后缀++
都是一元运算符,它们没有左侧和右侧操作数,但是应用它们的单个操作数。也就是说,在x++
和++x
中,x
是 操作数,而不是右手/左手,但是 操作数
然后,为什么在后缀版本的签名中需要int
,它采用人工整数参数(未使用)只是为了区分签名并允许编译器知道您正在声明/定义 postfix ++
而不是前缀版本。将它视为标签,而不是其他任何东西,因为语言需要不同的签名。
答案 1 :(得分:3)
是..它在标准中定义。
来自标准文档 13.5.7增量和减量,
名为operator ++的用户定义函数实现前缀和后缀++运算符。如果此功能是成员 没有参数的函数,或具有类或枚举类型的一个参数的非成员函数,它定义了 用于该类型对象的前缀增量运算符++。 如果函数是带有一个参数的成员函数(哪个 应该是int类型或具有两个参数的非成员函数(第二个应该是int类型),它 为该类型的对象定义后缀增量运算符++。当作为结果调用后缀增量时 使用++运算符,int参数的值为零。
答案 2 :(得分:3)
C ++需要在函数的签名上有所作为。不幸的是,x++
和++x
只有一个真正的参数,即x
。因此,C ++设计者在定义一个hack
时选择了一个虚拟的未使用的int参数。这导致了不同的方法签名,因此C ++编译器可以区分前缀和后缀运算符。