47句: 和46句的代码是一致的,但是此时调用的函数才是算术符重载函数
所以说,出现“=”的地方未必调用的都是算术符重载函数,也有可能是拷贝构造函数。那么什么时候是拷贝构造函数,什么时候是算术符重载函数呢?判断的标准其实很简单。如果临时变量是第一次出现,那么调用的只能是拷贝构造函数,反之如果变量已经存在,就像47句一样,那么调用的只能是算术符重载函数,但是我们这里定义的算数符重载函数有一个陷阱,不知道大家看出来没有?
我提示大家一下,这里的算术符重载需不需要判断拷贝的是不是自己呢?
void process()
{
data m(10);
data p = m;
p = p;
}
void process()
{
data m(10);
data p = m;
p = p;
} 这里最后一句,如果算术符可以自己拷贝给自己,代码正常编译和运行都没有问题,但是在某些情况下会出现很多意想不到的情况。大家可以跟着我的思路来:
data& operator=(const data& d){
if(this == &d) /* check whether it is self-copy action */
return *this;
if(number)
free(value);
number = d.get_number();
value = (char*)malloc(d.get_number());
memmove(value, d.get_point(), d.get_number());
return *this;
}
data& operator=(const data& d){
if(this == &d) /* check whether it is self-copy action */
return *this;
if(number)
free(value);
number = d.get_number();
value = (char*)malloc(d.get_number());
memmove(value, d.get_point(), d.get_number());
return *this;
}
如果上面的代码没有判断复制的对象是不是自己,那么我们发现实际上value的数据实际上已经free掉了。那么此时重新分配内存,拷贝的数据只有天知道是什么数据。原来value指向的内存空间就存在了很大的不确定性,这就是算术符重载的陷阱。