当前位置:   article > 正文

C++string深拷贝的进阶写法(现代写法)。_str c++ 复制三遍

str c++ 复制三遍

 string s1("hello world");

string s2(s1);

 s2(s1)需要用到拷贝构造函数,大多数情况下,我们写string拷贝构造函数我们会这样写,创建一个新空间后,把内容依次考入。 

  1. string(const string& s)
  2. {
  3. _str = new char[s._capacity+1];
  4. _size = s._size;
  5. _capacity = s._capacity;
  6. strcpy(_str, s._str);
  7. }

现在我们把上面这种写法叫传统写法。 下面是我们的进阶写法。(进阶写法不是为了提高效率,是为了代码更简洁。 )

  1. string(const string & s)
  2. {
  3. string tmp(s._str);//构造函数
  4. swap(_str, tmp._str);
  5. swap(_size, tmp._size);
  6. swap(_capacity, tmp._capacity);
  7. }

这里面的swap库模板如下。 

目前这是个不完善的进阶写法。我们继续往下看。

交换前。

 交换后

但是出拷贝构造函数时,tmp要释放,要调用析构函数,此时tmp的_str已经变成和原先this->_str一样的值,然而因为有的编译器不默认把_str设为NULL而是其他随机值的,那么tmp释放,调用析构函数,delete或free释放不是new或malloc等动态开辟的空间的话,就会报错,而delete或free对空指针释放不报错。

所以,为了解决这个问题,我们可以采用先把_str初始化为空的办法。此时tmp和this->_str交换地址后,tmp得到的是NULL,此时析构函数里面的delete或free不会报错。

  1. string(const string& s)
  2. ;_str(nullptr)
  3. , _size(0)
  4. , _capacity(0)
  5. {
  6. string tmp(s._str);//构造函数
  7. swap(_str, tmp._str);
  8. swap(_size, tmp._size);
  9. swap(_capacity, tmp._capacity);
  10. }

 这里面的swap其实也是std命名空间中的库模板。

此时各项值如下。

下面还需要对上面代码进一步优化。

问题:下面两个有什么区别。

第一个

第二个

上面的是一个其实是需要自己在类里面定义一个swap函数。

上面的第二个,其实是类模板,在上述代码中,T被系统识别为string类型,这里面需要进行三次深拷贝。

(一次拷贝构造,两次赋值)

 

(这部分了解即可)有了模板以后,内置类型必须有构造和析构了。

 这两个都是有意义的。

 

 第二个可以认为是调用int的默认构造。如果是int*j 那么j就是空指针。这两个都是因为为了兼容模板所以产生此现象的。

 下面是s1.swap(s2)方式代替swap(s1,s2)的方法。

  1. void swap(string& s)
  2. {
  3. std::swap(_str, s._str);
  4. std::swap(_size, tmp._size);
  5. std::swap(_capacity, tmp._capacity);
  6. }

swap前面如果不写std::的话会报错,因为swap会先在局部找,但是在局部类域找到的只有一个参数的swap,所以会报错。加上std,swap就直接在std里面找。

下面是赋值的进阶写法。 和进阶深拷贝有很多相似之处。

  1. string & = (const string & s)
  2. {
  3. if (*this != s)
  4. {
  5. string tmp(s);
  6. swap(tmp);
  7. }
  8. return *this
  9. }

这里面tmp用析构吗?

会析构的,只要定义了局部的对象  出了作用域都要销毁的。

下面string s相当于形参是拷贝构造的,所以可以直接swap进行交换。

  1. string & = (string s)
  2. {
  3. swap(s);
  4. return *this;
  5. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/501770
推荐阅读
相关标签
  

闽ICP备14008679号