【发布时间】:2011-02-16 04:03:40
【问题描述】:
如何区分运算符++的2个版本的重载?
const T& operator ++(const T& rhs)
哪一个?
i++;
++i;
【问题讨论】:
-
你的 C++ 教科书对这个主题有什么看法?
标签: c++ class templates struct operator-overloading
如何区分运算符++的2个版本的重载?
const T& operator ++(const T& rhs)
哪一个?
i++;
++i;
【问题讨论】:
标签: c++ class templates struct operator-overloading
对于非成员版本,具有一个参数的函数是前缀,而具有两个参数且第二个为int的函数是后缀:
struct X {};
X& operator++(X&); // prefix
X operator++(X&, int); // postfix
对于成员版本,零参数版本为前缀,一参数版本以int为后缀:
struct X {
X& operator++(); // prefix
X operator++(int); // postfix
};
用于调用后缀运算符的int 参数的值为零。
【讨论】:
这些运算符是一元的,即它们不带右侧参数。
至于你的问题,如果你真的必须重载这些运算符,对于前增量使用签名const T& operator ++(),对于后增量,const T& operator(int)。 int 参数是一个虚拟参数。
【讨论】:
op++ 添加到您的迭代器中,为什么需要非成员?
对于后缀 ++ 和 -- 运算符,该函数必须采用虚拟 int 参数。如果它没有参数,那么它是前缀运算符
【讨论】:
将后缀增量i++ 视为具有第二个(缺失)参数(即i++x)。所以后缀增量签名有一个右手参数,而前缀增量没有。
【讨论】: