c++默认右序入栈的一点理解

在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

猜你喜欢

转载自blog.csdn.net/qq_40420795/article/details/82222689