为啥这样写是对的?
为什么这样写是对的???http://coolshell.cn/articles/10478.html这里有篇文章,自己实现string类,有如下代
为什么这样写是对的???
http://coolshell.cn/articles/10478.html这里有篇文章,自己实现string类,有如下代码
String& operator=(String rhs) // yes, pass-by-value
{
swap(rhs);
return *this;
}
我不明白rhs不是局部变量吗,离开函数就析构了,那岂不是这个赋值函数有问题吗??? string 类 c++
[解决办法]我看了一下,string类的数据成员
....
private:
char* data_;
};
也就是说string类对象,就只有一个char*,而且没有虚函数,也即string类的对象中没虚函数表.
进行swap操作,也就是交换了一下char* data_ ,正好交换了之后,rhs离开函数就析构了,把原来的data_给释放了.你还别说,这样搞,还真妙.....
[解决办法]你听说过copy and swap没?这段代码就是运用了这个技术。
对于有指针数据成员的类,在进行值语义复制时,将目标类的堆内容释放再重新new的成本太高,也没必要,其实只要把源和目标两者的堆指针互换一下就行了,这就是copy and swap。
copy and swap的缺点是不能使用引用,原因是处理右值对象所要求的const对象的引用与指针互换的要求相矛盾,因此实参传递只能用值传递的方式。
C++11发布后,这个问题可以用右值引用和移动语义解决了,此时就可以使用引用了。