利用operator关键字在对象间进行赋值的几点注意事项(2)

      在上一篇博文中利用operator关键字在对象间进行赋值的几点注意事项(1),我提出了利用operator重载运算符来实现对象的自加运算,而在文章的最后,我提出了一个在性能上面的问题,就是创建对象。那么我们能不能不要创建对象就可以完成赋值操作呢?

      答案当然是可以的了,我们只需要利用this指针。inweithis指针就是当前对象的标签。那么实际上我们只需要将当前对象的成员变量自加,然后返回用this指针指向的当前对象就可以了。具体程序如下

#include <iostream>
using namespace std;
class num
{
public:
	num(int i) {n=i;cout<<"构造函数执行!"<<endl;}
	num(const num &s){this->n=s.n;cout<<"拷贝构造函数执行!"<<endl;}
	int get()const{return n;}
	num operator ++()
	{
		++n;
		return *this;
	}
private:
	int n;
};
int main()
{
	num i(1);
	cout<<"i="<<i.get()<<endl;
	num x=i++;
	cout<<"x="<<x.get()<<endl;
	return 0;
}

      首先我们关注这个程序的第7行,这里我们定义了一个复制构造函数,它的作用就是在程序12行返回this指针所指向的对象之后能够将其复制给新的对象。我们在程序的第12行返回this指针的时候,其实返回的是this指针所指向的对象,在这里是i。而我们在程序的第11行将i的数据成员n进行了自加,所以返回的this所指向的i中间的n这个时候应该就是2,而不是1。

      返回之后,编译器就会调用位于程序第7行的复制构造函数。此时的参数应该是这样的,我们给复制构造函数传递的参数应该是i,而函数体中的this->n中的this实际上指的应该是位于程序第21行所创建的对象x。这个时候,我们可以把程序第21行这句话理解成  

num x(i.operator());

      因为返回的是this指针,即自加之后的对象i,所以说此时编译器利用复制构造函数将对象x也复制成i的样子,即x.n=2。

      程序的输出证明了我们的想象:

     

posted @ 2011-09-25 16:05  uniqueliu  阅读(1066)  评论(0编辑  收藏  举报