C++深浅拷贝和string类的两种写法详解
拷贝这个词对于我们来说应该不陌生比如我们平常的复制和粘贴就是拷贝但是如果把拷贝这个词放到C中来说就有一些复杂了我们先来看一下什么是浅拷贝下面用字符串类来模拟实现。1234567891011121314151617181920212223242526272829classAstring{public://构造函数Astring(constchar* str ){_str newchar[strlen(str) 1];strcpy(_str, str);}//采用浅拷贝写的构造函数Astring(constAstring s){_str s._str;}//析构函数~Astring(){delete[] _str;_str nullptr;}private:char* _str;};intmain(){Astring aa(hello C);Astring bb(aa);//这里调用拷贝构造return0;}当我们执行以上程序的话就会失败结果如下分析如下图所示所以我们采用浅拷贝使用同一块空间是不行了那么怎么办呢当然是重新开一块和别人同样大小的空间然后再把别人空间里面的内容给拷贝过来而这样就是所谓的深拷贝了我们还是用字符串类来模拟实现深拷贝12345678910111213141516171819202122232425262728293031classAstring{public://构造函数Astring(constchar* str ){_str newchar[strlen(str) 1];strcpy(_str, str);}//采用深拷贝写的构造函数Astring(constAstring s){_str newchar[strlen(s._str) 1];strcpy(_str, s._str);}//析构函数~Astring(){delete[] _str;_str nullptr;}private:char* _str;};intmain(){Astring aa(hello C);Astring bb(aa);return0;}分析如下图所示二、string类的两种写法有了上面我们知道的深浅拷贝所以我们明白类中的拷贝构造函数和赋值重载一定要用深拷贝来实现不过拷贝构造函数和赋值重载还是有两种写法的。1. 传统写法传统写法就是要自己开辟空间自己来拷贝别人的东西什么事情都要自己干代码如下12345678910111213141516171819202122232425262728293031323334353637383940//搞一个命名空间里面实现自己写的string类namespacecjy{classstring{public://构造函数string(constchar* str ):_str(newchar[strlen(str) 1]){strcpy(_str, str);}//拷贝构造函数string(string s):_str(newchar[strlen(s._str) 1]){strcpy(_str, s._str);}//赋值重载,s1s3string operator(conststring s){if(this! s){char* tmp newchar[strlen(s._str) 1];delete[] _str;_str tmp;strcpy(_str, s._str);}return*this;}//析构函数~string(){delete[] _str;_str nullptr;}private:char* _str;};}2. 现代写法现代写法就是复用其它的函数自己不用干活交给其它函数来帮你实现代码如下1234567891011121314151617181920212223242526272829//现代写法拷贝构造、赋值重载函数namespacecjy{classstring{public://构造函数string(constchar* str ){_str newchar[strlen(str) 1];strcpy(_str, str);}//拷贝构造函数string(conststring s):_str(nullptr){string tmp(s._str);std::swap(_str, tmp._str);}//赋值重载string operator(string s){std::swap(_str, s._str);return*this;}private:char* _str;};}分析如下图所示总结本篇文章就到这里了希望能够给你带来帮助