后置++ 運算符重載
Coordinate.h
-----------------------------------------------------------------------------
#ifndef COORDINATE_H
#define COORDINATE_H
class Coordinate
{
?? ?//friend Coordinate &operator-(Coordinate &Coor);?? ??? ??? ?//友元一重運算符重載
public:
?? ?Coordinate(int x = 0, int y = 0);?? ??? ??? ??? ??? ??? ?
?? ?Coordinate& operator-();?? ??? ??? ??? ??? ??? ??? ??? ??? ?//成員函數一重運算符重載
?? ?/*?? ?前置/后置 ++?? ?*/
?? ?Coordinate& operator++();?? ??? ??? ??? ??? ??? ??? ??? ??? ?//前置++
?? ?Coordinate operator++(int);?? ??? ??? ??? ??? ??? ??? ??? ??? ?//后置++
?? ?int getX();
?? ?int getY();
private:
?? ?int m_iX;
?? ?int m_iY;
};
#endif
Coordinate.cpp
--------------------------------------------------------------------------
#include "Coordinate.h"
Coordinate::Coordinate(int x,int y)
{
?? ?m_iX = x;
?? ?m_iY = y;
}
Coordinate & Coordinate::operator-()
{
?? ?m_iX = -m_iX;
?? ?m_iY = -m_iY;
?? ?return *this;
}
Coordinate & Coordinate::operator++()
{
?? ?m_iX++;
?? ?m_iY++;
?? ?return *this;
}
Coordinate Coordinate::operator++(int)
{
?? ?Coordinate Old(*this);
?? ?m_iX++;
?? ?m_iY++;
?? ?return Old;
}
int Coordinate::getX()
{
?? ?return m_iX;
}
int Coordinate::getY()
{
?? ?return m_iY;
}
main.cpp
--------------------------------------------------------------------------
#include <iostream>
#include "Coordinate.h"
using namespace std;
int main()
{
?? ?Coordinate *coor = new Coordinate(1, 3);
?? ?cout<< coor->getX()<<","<<coor->getY()<<endl;
?? ?cout << ((*coor)++).getX() << ","
?? ??? ?<< ((*coor)++).getY() << endl;
?? ?delete coor;
?? ?coor = NULL;
?? ?system("pause");
?? ?return 0;
}
----------------------------------------------------------
問題? 當后置++ 輸出的結果是 2,3 。正好和1,4相反
求解惑
2018-10-08
你這個把兩個后置++放在一條cout語句中輸出,按照C++標準會產生一個未定義的行為。編譯器在處理輸出流的過程是按照自右向左的順序對各輸出項進行求值的。所以先進行((*coor)++).getY()的求值得到3,再進行((*coor)++).getX()的求值得到2,最后按順序輸出2,3。要想得到1,4最好將其分成兩條cout語句來寫。
這就和int a = 1; cout << a++ << a++ << endl;得到的結果是2,1的道理是一樣的。
2019-06-09
a=i++;實際意義為a=1,i=i+1;兩條語句,所以?
((*coor)++).getX() 的意思是?*coor->getX() (數據流輸出結果),coor->operator++(int);
然后同理((*coor)++).getY() 的意思是?*coor->getX() (數據流輸出結果),coor->operator++(int);
這個和運算的優先級有關。