前置与后置++

前置++与后置++

转自 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被析构
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

明前大奏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值