前置++与后置++
转自 http://blog.csdn.net/randyjiawenjie/article/details/6747720
class TestPlusP {
private:
int data;
static int count;
int id;
public:
TestPlusP(int d =0 ) {
data = d;
id = count++;
cout << "构造函数" << " id=" << id<< endl;
}
~TestPlusP() {
cout << "析构" << " id=" << id << endl;
}
//运算符重载
TestPlusP& operator++(){
++this->data;
cout << "前置++运算符重载:"<< endl;
return *this;
}
const TestPlusP operator++(int) {
TestPlusP temp = *this;
++(*this);
cout << "后置++运算符重载:" << endl;
return temp;
}
TestPlusP& operator=(int i) {
data = i;
cout << "赋值运算符" << endl;
return *this;
}
TestPlusP(TestPlusP& t) {
data = t.data;
id = count++;
cout << "拷贝构造" << " id=" << id << endl;
}
};
int TestPlusP::count = 0;
仔细看前置++和后置++ 的重载函数,有四点不同:
- 函数参数不同: 后置需要有一个int 形参,**这里是用作与前置++区别,**没有其他含义了
- 代码不同:
- 前置++的内涵: 取当前对象地址后,把内容+1然后返回该对象(上述的重载函数其实隐含的有一个this指针,这个指针就是指的当前对象的地址);
- 后置++的内涵: 取当前对象地址后,把内容拷贝下来给一个临时对象,返回的是这个临时对象,而当前的对象的内容也会+1
- 返回类型不同:
- 前置++的返回类型是引用类型,为左值(引用就是绑定)
- 后置++的返回类型常对象,这个一定会有临时对象生成,为右值
- 效率不同: 前置效率高,后置效率比之差(会生成临时对象)
测试
void test_09() {
TestPlusP p(10);
p++;
cout << endl;
++p;
}
分析:
- 构建对象p,调用构造函数;
- 进入后置运算符重载函数:
- TestPlusP temp = *this; 会调用拷贝构造函数生成一个临时对象1 temp(*this 指的是当前的对象p)
- ++(*this); 会调用前置++运算符重载函数, *this就看作当前对象p,进入前置++运算符重载函数,隐含的会有一个this指向当前对象p,操作完毕,由于函数返回类型是引用,其实就是返回的当前对象
- return temp; 结合后置++的返回类型是 const TestPlusP,实际会发生 TestPlusP 临时 = temp,这里就又会利用拷贝构造生成一个临时对象2
- 此函数结束,临时对象1就会被析构,临时对象2不会
- 回到主函数,执行完p++后,临时对象2被析构