下面这段代码是自实现的myString的移动赋值(深拷贝)
class myString
{
public:
myString()
{
_str = new char;
*_str = '0';
}
myString(char * str)
{
int len = strlen(str);
_str = new char[len+1];
strcpy(_str,str);
}
~myString()
{}
myString & operator = (const myString & another)
{
printf("another address = %0X\n",&another);
printf("this address = %0X\n",this);
this->_str = new char[strlen(another._str)+1];
strcpy(this->_str,another._str);
return *this;
}
char * _str;
};
int main()
{
int num =1;
myString a ("num");
myString b;
myString c;
(c=b)=a;
cout<<c._str<<endl;
cout<<b._str<<endl;
return 0;
}
如果移动赋值返回引用,则打印结果如下
如果移动赋值不返回引用,返回的是对象,则打印结果如下
分析上述结果可以得出
返回引用(c=b)=a的时候,c=b的表达式返回值是c的引用,(c的地址都是61FE90)。
使用a对c的引用再次赋值,所以cout<<c._str<<endl可以打印出“num”
返回对象(c=b)=a的时候,c=b的表达式返回值是c的一个拷贝出来的新对象,
(c的地址是61FE88,拷贝产生的新对象是61FE98)。
使用a对新对象进行赋值,所以cout<<c._str<<endl只能打印出“0”
提醒:类中申请了空间的对象若要进行拷贝,一定要自实现深拷贝!
系统默认实现的是浅拷贝,只是拷贝一个地址而已。空间被回收后再次访问就会报错。