首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

为啥这样写是对的?

2013-11-01 
为什么这样写是对的???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_给释放了.你还别说,这样搞,还真妙.....
[解决办法]
引用:
http://coolshell.cn/articles/10478.html这里有篇文章,自己实现string类,有如下代码
String& operator=(String rhs) // yes, pass-by-value
  {
    swap(rhs);
    return *this;
  }


我不明白rhs不是局部变量吗,离开函数就析构了,那岂不是这个赋值函数有问题吗???


你听说过copy and swap没?这段代码就是运用了这个技术。

对于有指针数据成员的类,在进行值语义复制时,将目标类的堆内容释放再重新new的成本太高,也没必要,其实只要把源和目标两者的堆指针互换一下就行了,这就是copy and swap。

copy and swap的缺点是不能使用引用,原因是处理右值对象所要求的const对象的引用与指针互换的要求相矛盾,因此实参传递只能用值传递的方式。

C++11发布后,这个问题可以用右值引用和移动语义解决了,此时就可以使用引用了。

热点排行