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++;//
}
老大,你的回答虽然很清楚,我也明白什么时候返回值什么时候返回引用,但是你没回答到我的问题点上啊:c2 = ++c1;//为啥这里调用的是前++重载操作符,而非后++;编译器如何判断的?
追答编译器是如何判断前++和后++到底调用哪一个,这里是语法问题了
在C++语法中
为了区分前++和后++:前++用 函数 ++(void) , 后++用函数++(int),这是固定语法
证明上述说法可以应下面两个语句就可以证明:
Complex& operator++(void)
Complex const operator++(doule)
这两条语句不能通过编译
如何区分调用的 前++重载函数 还是 后++重载函数?
这个实际上是编译器会自动识别,可以说是一些固定语法
比如a++ 自动调用后++函数,++a自动调用前++函数,这些都是固定语法。
就如同你写的C++代码,要让编译器识别,就必须蹲守编译器规定下来的语法规则,等同于编译器是如何识别C++语法。
根据入参不一样,判断的。
追问//c2 = ++c1;
c2=c1.operator++();
//c2 = c1++;
c2=c1.operator++(0);
老大,我就是对这里不理解啊,能详细解释一下吗?