重载后缀和前缀操作符
overloading postfix and prefix operators
请考虑以下代码
#include <iostream>
using namespace std;
class Digit
{
private:
int m_digit;
public:
Digit(int ndigit=0){
m_digit=ndigit;
}
Digit& operator++();//prefix
Digit& operator--(); //prefix
Digit operator++(int);
Digit operator--(int);
int get() const { return m_digit;}
};
Digit& Digit::operator++(){
++m_digit;
return *this;
}
Digit& Digit::operator--(){
--m_digit;
return *this;
}
Digit Digit::operator++(int){
Digit cresult(m_digit);
++(*this);
return cresult;
}
Digit Digit::operator--(int){
Digit cresult(m_digit);
--(*this);
return cresult;
}
int main(){
Digit cDigit(5);
++cDigit;
cDigit++;
cout<<cDigit.get()<<endl;
cout<<cDigit.get()<<endl;
return 0;
}
在这里实现了后缀和前缀操作符的两个版本,我已经读到通过引入另一个所谓的假参数来实现差异,但我有疑问,如果我们看到这些
的声明Digit& operator++();//prefix
Digit& operator--(); //prefix
Digit operator++(int);
Digit operator--(int);
用&马克,为什么它是假论证?在这两种情况下,例如,++运算符写在参数之前,这是否意味着它们是相同的?
自增前操作符和自增后操作符是两个不同的操作符,需要分别重载。
c++不允许只在返回类型上重载,所以在你的例子中使用不同的返回类型并不足以消除这两个方法的歧义。
虚拟参数是c++设计者为消歧选择的机制。
在前递增/递减和后递增/递减中,差异仅基于重载函数
中的虚拟参数operator++() => Prefix Increment
operator--() => Prefix Decrement
operator++(int) => Postfix Increment
operator--(int) => Postfix Decrement
返回类型可以相同。您也可以参考:http://www.tutorialspoint.com/cplusplus/increment_decrement_operators_overloading.htm
与任何函数一样,操作符由签名标识。函数/操作符名称之前的返回类型和修饰符不包括在其中。您的操作符名称在这里
operator++()
operator++(int)
这是编译器区分两者的唯一方法。对于Digit&
和Digit
的返回值;它们是必需的,因为c++ x和x++的操作方式。
在c++中,函数/方法不能通过返回类型重载,只能通过参数列表重载。忽略前缀和后缀操作符都是操作符这一事实,想象一下,如果它们只是简单的其他函数,编译器如何根据返回类型确定使用哪个?例如
int x = 2;
const int DoIt()
{
return 1;
}
int& DoIt()
{
return x;
}
int y = DoIt();
由于操作符重载本质上只是函数,因此编译器无法通过返回类型来区分它们。
见http://www.parashift.com/c + + -faq-lite/operator-overloading.html #常见问题- 13.14
相关文章:
- 编译器如何在前缀和 postix 运算符之间进行区分?
- 查找带有 Anaconda cmake 前缀的 boost-python3
- 迭代器类的重载前缀增量运算符会引发分段错误
- 如何在友元函数中使用静态成员而不添加前缀 [类名]::
- 生成前缀位掩码
- 定义宏以将前缀 0x 添加到十六进制字符串文本
- CMake 错误 - 目标 foo INTERFACE_SOURCES属性包含在源目录中以前缀为前缀的路径
- 如何在自定义对象的<<运算符中添加自定义前缀
- 高效的字符串截断算法,按顺序删除相等的前缀和后缀
- 以C++显示单词的所有前缀
- QXmlStreamWriter,命名空间和前缀
- 为什么 C++ 程序员更喜欢前缀 ++,而 Java 程序员更喜欢后缀 ++?
- 为什么 libclang 会错误解析带有 .h 前缀C++标头?
- 目标是找到两个 c 字符串之间的公共前缀(必须使用特定的函数标头)
- 我需要在C++的两个字符串之间找到共同的前缀
- 前缀操作符在c++和c#中的差异
- 前缀和后缀操作符继承
- 重载后缀和前缀操作符
- c++中迭代器的前缀和后缀自增操作符重载实现的区别
- 如何重载()操作符作为前缀