本文学习自 狄泰软件学院 唐佐林老师的 C++课程
实验1:++i 和 i++ 真的不一样吗
实验2:++操作符的重载
根据C的前后置++的语义, 前置++ 返回 变量自加后本身, 后置++ 先保存自己的值到一个临时变量,然后再自加1,最后返回保存的临时变量。那么在C++中 前置++ 返回对象自加后本身,后置++返回 对象自加前的值,不返回自加后本身。所以前置++重载返回的是 Test& ,而后置++重载返回的是 Test类。
实验1:++i 和 i++ 真的不一样吗
#include <iostream>
#include <string>
using namespace std;
int main()
{
int i = 0;
i++;
++i;
return 0;
}
实际工程里所使用的编译器都会进行一些优化,优化的目的是使得最终的二进制程序更加的高效,对于上述单独出现的 i++ 和 ++i 这两行代码,由于没有使用他们的返回值,所以编译器对他们进行了优化,优化的结果就是他们是一模一样的。也就是说优化后的二进制代码丢失了C/C++的原生寓意,这样的结果就是我们不可能从编译后的二进制程序还原C/C++程序。
实验2:++操作符的重载
#include <iostream>
#include <string>
using namespace std;
class Test
{
int mValue;
public:
Test(int i)
{
mValue = i;
}
int value()
{
return mValue;
}
//前置++ 返回类引用对象
/*
前置++ 返回 对象自加后本身
*/
Test& operator ++ ()
{
++mValue;
return *this;//返回自加后的本身
}
//后置++ 返回类对象
/*
后置++ 返回 对象自加前的值,不返回自加后本身
*/
Test operator ++ (int)
{
Test ret(mValue);
mValue++;
return ret;//返回自加前的值
}
};
int main()
{
Test t(0);
t++;
++t;
return 0;
}
根据C的前后置++的语义, 前置++ 返回 变量自加后本身, 后置++ 先保存自己的值到一个临时变量,然后再自加1,最后返回保存的临时变量。那么在C++中 前置++ 返回对象自加后本身,后置++返回 对象自加前的值,不返回自加后本身。所以前置++重载返回的是 Test& ,而后置++重载返回的是 Test类。
所有的重载都是为了可以针对类对象做和对变量一样的操作。
重载后置的++ 还需要调用构造函数和析构函数,效率相对低