浅析浅拷贝与深拷贝
来源:互联网 发布:java生成六位验证码 编辑:程序博客网 时间:2024/06/07 09:32
一、浅拷贝:
浅拷贝就是成员数据之间的赋值,把值赋给要拷贝的。即在对象复制时,只是对对象中的数据成员进行简单的赋值,所以会导致多个对象共用一块内存空间,当一个对象将这块内存释放掉之后,另外对象并不知道空间已经还给了系统,所以会在对这段内存空间进行访问时出现访问违规。
如下例子:
class String{public: String(const char*str = "") //构造函数 { if (NULL == str) { _str = new char[1]; *_str = '\0'; } else _str = new char[strlen(str) + 1]; strcpy(_str, str); } String(const String&d) //浅拷贝 :_str(d._str) {} String&operator=(const String&d) //赋值运算符 { if (this != &d) { _str = d._str; } return *this; }private: char*_str;};int main(){ String c1="hello"; String c2(c1); cout << c2 << endl; system("pause"); return 0;}
二、深拷贝
在深拷贝的情况下,要进行重新动态分配空间,进行动态内存开辟。具体的String实现如下:
class String{public: String(const char*str = "") //构造函数 { if (NULL == str) { _str = new char[1]; *_str = '\0'; } else _str = new char[strlen(str) + 1]; strcpy(_str, str); } String(const String &d) //拷贝构造函数(深拷贝) { _str=new char[strlen(d._str) + 1]; strcpy(_str, d._str); String &operator=(const String &d) //赋值运算符 { if (this != &d) { char*pstr = new char[strlen(d._str) + 1]; strcpy(pstr, d._str); delete[]_str; _str = pstr; } return *this; } bool operator==(const String&d)const { if (strlen(_str) != strlen(d._str)) { return false; } if ((strcmp(_str, d._str)) == 0) return true; else return false; } bool operator<(const String&d)const { if (strcmp(_str, d._str) < 0) { return true; } return false; } bool operator>(const String&d)const { if (strcmp(_str, d._str)>0) { return true; } return false; } bool operator<=(const String&d)const { if (strcmp(_str, d._str) <=0) { return true; } return false; } bool operator>=(const String&d)const { if (strcmp(_str, d._str)>=0) { return true; } return false; } char operator[](int idx) // 数组索引 { if (idx > 0 && (idx < strlen(_str))) return _str[idx]; } size_t size() { return strlen(_str); } ~String() { delete[] _str; } friend ostream&operator<<(ostream&_cout, String&d); friend istream&operator>>(istream&_cin, String&d);private: char*_str;};ostream &operator<<(ostream&cout, String&d){ cout << d._str; return cout;}istream&operator>>(istream&cin, String&d){ char str[20]; cin >> str; d = str; return cin;}int main(){ String c1="hello"; cout << c1 << endl; String c2 = "world"; cout << boolalpha <<(c1 ==c2)<<endl ; String c3(c2); cout << c3 << endl; cout << c3[2] << endl; system("pause"); return 0;}
具体运行结果如下:
以上是深拷贝的普通版。
下面示例为深拷贝的简洁版:
只需将拷贝构造与赋值运算符重载修改即可:String(const String &d) //拷贝构造函数(深拷贝) { String temp(d._str); swap(_str, temp._str); } String &operator=(const String &d) //赋值运算符 { if (this != &d) { String temp(d._str); //调用构造函数 swap(_str, temp._str); } return *this; }
此时,在完成对象的复制后,内存的一个大致情况如下:
此时c1和c2各自指向一段内存空间,但它们指向的空间具有相同的内容,这就是所谓的“深拷贝”。
阅读全文
0 0
- 浅析C#深拷贝与浅拷贝
- 浅析C#深拷贝与浅拷贝
- 浅析C#深拷贝与浅拷贝
- 浅析C#深拷贝与浅拷贝
- C++ 浅拷贝与深拷贝浅析
- 浅析C#深拷贝与浅拷贝
- 浅析C#深拷贝与浅拷贝
- 浅析C#深拷贝与浅拷贝
- 浅析C#深拷贝与浅拷贝
- JavaScript浅拷贝与深拷贝浅析
- 浅析浅拷贝与深拷贝
- 浅析Java中的深拷贝与浅拷贝
- 浅析Java中的深拷贝与浅拷贝
- 浅析C#深拷贝与浅拷贝 (转)
- 浅析深拷贝和浅拷贝
- 深拷贝与浅拷贝
- 深拷贝与浅拷贝
- 深拷贝与浅拷贝
- Reverse Integer--LeetCode
- 简易解说拉格朗日对偶
- Thymeleaf模板的使用
- HTML
- Activiti 跳转节点
- 浅析浅拷贝与深拷贝
- 训练总结 10.1
- java基础-锁
- Quartz定时任务框架
- 概率基础
- POJ 3608 求两个凸包之间的最小距离
- leetcode 7. Reverse Integer(C语言,翻转一个整数,判断是否溢出)19
- bmp字节对齐公式
- document 对象的集合对象以及为什么js有时候需要在body中