Martin

爱设计,爱创造|To design and create

深入理解前置自增和后置自增

前言

定义

前置自增先进行赋值后自增,后置自增先进行自增后赋值

个人理解

实际上是运算级优先的的问题。对于++i,++在最前面,就是先进行自增运算。i ++则是相反。

正文干货

要想深入理解两者的区别,我们造个轮子就行了。

先定义个最简单的数字类Num,只有一个属性整形变量number。我们可以将这个类的对象视为一个整形变量。

1
2
3
4
5
6
7
8
9
10
class Num //定义Num
{
private:
int number;
public:
Num(int num = 0) :number(num) {}; //构造函数
Num operator ++(); //初始化重载函数
Num operator ++ (int);
friend ostream & operator<<(ostream &out, const Num num);
};

然后我们进行运算符重载,实现这个类的前置自增和后置自增。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//前置自增运算
Num Num::operator++()
{
number += 1; //number自增1
return *this; //返回this对象
}


//后置自增运算
Num Num::operator++(int) //形参用以区别于上面的重载函数,绕过语法限制,没有实际意义
{
Num temp = *this;//复制this对象
(*this).number += 1;//number自增1
return temp;//返回复制的对象
}

最后,再将输出运算符<<也重载一下就完美了。

1
2
3
4
5
6
//运算符<<重载函数
ostream & operator<<(ostream &out, const Num num)
{
out << num.number;
return out;
}

测试一下:)

1
2
3
4
5
6
7
int main()
{
Num a(1);
cout << a++ << endl;//输出1
cout << ++a << endl;//输出3
return 0;
}

从上面代码可以看出,两个函数输出的对象完全不同,前置和后置自增两者的区别甚大。

Proudly powered by Hexo and Theme by Hacker
© 2021 Martin Yong