第40课.前置操作符和后置操作符
前置操作符: ++i; --i;
后置操作符: i++; i--;
1.i++和++i和区别?
下面的代码有没有区别?为什么?
i++;
++i; //注:与j = i++; 有区别
在工程中,独立的这两行语句是完全一样的没有差异(从汇编代码去看)。原因是,编译器的优化,这样做更高效。
对于基础类型的变量(未重载)
a.两行语句是完全一样的没有差异(从汇编代码去看)
b.前置++的效率与后置++的效率基本相同
对于类类型的对象(重载)
a.两者完全不一样
b.前置++的效率高于后置++
2.前者操作符和后置操作的重载
a.全局函数和成员函数均可进行重载(推荐成员函数重载)
b.重载前置(++, --)操作符不需要额外的参数
c.重载后置(++, --)操作符需要一个int类型的占位参数
eg:
#include <iostream>
#include <string>
using namespace std;
class Test
{
int mValue;
public:
Test(int i)
{
mValue = i;
}
int value ()
{
return mValue;
}
Test& operator ++ () // Test& 这里使用引用没有问题,因为这里返回的是主函数里定义的当前对象。它只会在主函数结束时才被释放
{
++mValue;
return *this;
}
Test operator ++ (int) // Test 这里返回的是Test对象。是因为。这里定义了一个局部对象,我们需要返回的值存储在局部对象中。所以我们
// 需要直接返回这个对象。而不能返回引用(引用的局部对象会在return的时候,被释放。这样引用就错误了)。
// 如果这里返回this对象的话,就无法实现后置++的功能了
{
Test ret(mValue);
mValue++;
return ret;
}
};
int main()
{
Test t(0);
t++; // 此时t++和下面的++t是不一样的。因为他们重载调用的函数不同
cout << "t++ = " << t.value() << endl;
++t; //
cout << "++t = " << t.value() << endl;
return 0;
}