做国际贸易的有哪有个网站,快手app下载安装免费下载,网站开发项目介绍ppt,windows7优化大师1.浅拷贝
浅拷贝#xff1a;也称位拷贝#xff0c;编译器只是将对象中的值拷贝过来。如果对象中管理资源#xff0c;最后就会导致多个对象共享同一份资源#xff0c;当一个对象销毁时就会将该资源释放掉#xff0c;而此时另一些对象不知道该资源已经被释放#xff0c;以…1.浅拷贝
浅拷贝也称位拷贝编译器只是将对象中的值拷贝过来。如果对象中管理资源最后就会导致多个对象共享同一份资源当一个对象销毁时就会将该资源释放掉而此时另一些对象不知道该资源已经被释放以为还有效所以当继续对资源进项操作时就会发生发生了访问违规
就像一个家庭中有两个孩子但父母只买了一份玩具两个孩子愿意一块玩则万事大吉万一不想分享就你争我夺玩具损坏 可以采用深拷贝解决浅拷贝问题即每个对象都有一份独立的资源不要和其他对象共享。父母给每个孩子都买一份玩具各自玩各自的就不会有问题了 2.深拷贝
如果一个类中涉及到资源的管理其拷贝构造函数、赋值运算符重载以及析构函数必须要显式给出。一般情况都是按照深拷贝方式提供 2.1 传统版写法的String类
class String
{
public:String(const char* str ){// 构造String类对象时如果传递nullptr指针可以认为程序非if (nullptr str){assert(false);return;}_str new char[strlen(str) 1];strcpy(_str, str);}String(const String s): _str(new char[strlen(s._str) 1]){strcpy(_str, s._str);}String operator(const String s){if (this ! s){char* pStr new char[strlen(s._str) 1];strcpy(pStr, s._str);delete[] _str;_str pStr;}return *this;}~String(){if (_str){delete[] _str;_str nullptr;}}
private:char* _str;
};
2.2 现代版写法的String类
class String
{
public:String(const char* str ){if (nullptr str){assert(false);return;}_str new char[strlen(str) 1];strcpy(_str, str);}String(const String s): _str(nullptr){String strTmp(s._str);swap(_str, strTmp._str);}// 对比下和上面的赋值那个实现比较好String operator(String s){swap(_str, s._str);return *this;}/*String operator(const String s){if(this ! s){String strTmp(s);swap(_str, strTmp._str);}return *this;}*/~String(){if (_str){delete[] _str;_str nullptr;}}
private:char* _str;
};
3.写时拷贝(了解) 写时拷贝就是一种拖延症是在浅拷贝的基础之上增加了引用计数的方式来实现的。
引用计数用来记录资源使用者的个数。在构造时将资源的计数给成1每增加一个对象使用该资源就给计数增加1当某个对象被销毁时先给该计数减1然后再检查是否需要释放资源如果计数为1说明该对象时资源的最后一个使用者将该资源释放否则就不能释放因为还有其他对象在使用该资源