在james_yuan老师上的c++远征之模板篇中对于单目运算符前置++和后置++做了如下的笔记,并且在这个过程中学会了用typora书写markdown文档,还有c++中默认右序入栈的知识。(本文是自己第一篇使用typora写作的csdn博客,惊喜地发现typora强大的易用性,所写即所见的markdown特性)
为了方便自己日后查看,所有的源代码如下:
Coordinate.h文件:
#ifndef COORDINATE_H_
#define COORDINATE_H_
using namespace std;
class Coordinate
{
public:
Coordinate(int x,int y);
Coordinate & operator++(); //前置++
Coordinate operator++(int); //后置++ int只是用来区分是否是后置++
int getX();
int getY();
private:
int m_iX;
int m_iY;
};
#endif
Coordinate.cpp文件:
#include "Coordinate.h"
#include <iostream>
using namespace std;
Coordinate::Coordinate(int x,int y):m_iX(x),m_iY(y)
{
}
int Coordinate::getX()
{
return m_iX;
}
int Coordinate::getY()
{
return m_iY;
}
Coordinate & Coordinate::operator++() //前置++
{
m_iX++;//++m_iX;
m_iY++;//++m_iY;
return *this;
}
Coordinate Coordinate::operator++(int) //后置++
{
Coordinate old(*this); //把调用operator++(int)这个函数的对象赋值给一个新的对象old,该过程会调用默认拷贝构造函数
this->m_iX++;
this->m_iY++; //让原对象的数据成员加了1
return old; //但返回的是没有加1之前的对象,这个过程类似于a = 1;b = a;a++ 现在b(相当于old)还是等于1,并没有随着a++变化
}
demo.cpp文件:
#include "Coordinate.h"
#include <iostream>
using namespace std;
/****************************************************/
/* Time:2018年8月30日13:48:06
/*运算符重载:---一元运算符重载
要求:定义Coordinate坐标类
成员函数:构造函数,getX(),getY()
数据成员:m_iX,m_iY
1、负号运算符的重载(成员函数,友元函数)
2、++运算符的重载(前置++,后置++)
*/
/****************************************************/
int main(void)
{
Coordinate c1(1,3);
Coordinate c2(1,3);
cout << "++c1(1,3): " // #1 前置++:先加1,再赋值给其表达式
<< (++c1).getX() << ","
<< (++c1).getY() << endl;
cout << "c2(1,3)++: " // #2 后置++:先把值赋值给其表达式,再加1
<< (c2++).getX() << ","
<< (c2++).getY() << endl;
cin.get();
return 0;
}
该程序的运行结果如下:
c++默认右序进栈:在由”<<”连接在一起的一组语句,越是远离出口cout的语句,越是会被先执行,就像是一股水流,只有后面的水流流动起来,才能推动前面的水流流动。
所以入栈时:
对于#1:
(++c1).getX(),(++c1).getY()在同一语句时先执行右边的(++c1).getY,得到4,然后左边的(++c1).getX,得到3
对于#2:
(c2++).getX(),(c2++).getY()在同一语句时先执行右边的(c2++).getY,得到3,然后左边的(c2++).getX,得到2
出栈时:
出栈时,遵循后进先出原则,所以会先打印getX的值,再打印getY的值;
- 对于#1的结果就是3,4
- 对于#2的结果就是2,3