C++,前置++和后置++操作符重载时,为啥通过哑元就能进行区分呢?

class Complex {
private:
int m_r;
int m_i;
public:
Complex (int r = 0, int i = 0) :m_r (r), m_i (i) {}
// 前++
Complex& operator++(void) {
++m_r;
++m_i;
return *this;
}
// 后++
Complex const operator++(int) {
Complex old = *this;
++m_r;
++m_i;
return old;
}
int main (void) {
Complex c1 (1, 2);
Complex c2 ;
c2 = ++c1;//为啥这里调用的是前++重载操作符,而非后++;编译器如何判断的?
c2 = c1++;//
}

比如:
问题1:
/* 两个函数重定义 不能通过编译 */
Complex& operator++(void)

Complex const operator++()

/* 两个函数形成重载关系,能通过编译 */
Complex& operator++(void)

Complex const operator++(int)

问题2:
前++和后++ 最根本的区别:
前++是先运算,后赋值
后++是先赋值,后运算

问题3:
/* 这三条语句是把运算后的值返回了,所以说前++的重载函数的实现 */
++m_r;
++m_i;
return *this;

/* 这三条语句,把运算之前的值old返回了,所有说是后++重载函数的实现 */
Complex old = *this;
++m_r;
++m_i;
return old;

问题4:
为什么前++返回的可以是对象引用值 ,后++返回的只能是对象?
因为前++,返回值是*this,表示该变量不是重载函数的局部变量,所以可以放回其引用
后++,的返回值是old,old重载函数的的局部变量,所以不能返回old引用。追问

老大,你的回答虽然很清楚,我也明白什么时候返回值什么时候返回引用,但是你没回答到我的问题点上啊:c2 = ++c1;//为啥这里调用的是前++重载操作符,而非后++;编译器如何判断的?

追答

编译器是如何判断前++和后++到底调用哪一个,这里是语法问题了

在C++语法中
为了区分前++和后++:前++用 函数 ++(void) , 后++用函数++(int),这是固定语法

证明上述说法可以应下面两个语句就可以证明:
Complex& operator++(void)
Complex const operator++(doule)
这两条语句不能通过编译

如何区分调用的 前++重载函数 还是 后++重载函数?
这个实际上是编译器会自动识别,可以说是一些固定语法
比如a++ 自动调用后++函数,++a自动调用前++函数,这些都是固定语法。
就如同你写的C++代码,要让编译器识别,就必须蹲守编译器规定下来的语法规则,等同于编译器是如何识别C++语法。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-11-20
int main (void)
{
Complex c1 (1, 2);
Complex c2 ;
//c2 = ++c1;
c2=c1.operator++();
//c2 = c1++;
c2=c1.operator++(0);
}

根据入参不一样,判断的。

追问

//c2 = ++c1;
c2=c1.operator++();
//c2 = c1++;
c2=c1.operator++(0);
老大,我就是对这里不理解啊,能详细解释一下吗?