深拷贝的传统写法
2016-03-21 19:40
676 查看
![](http://s2.51cto.com/wyfs02/M00/7D/FD/wKioL1b0wHTQP_TZAAA3oYkk79E281.png)
![](http://s2.51cto.com/wyfs02/M02/7E/00/wKiom1b0wB3yNklnAABTVBofwnc648.png)
/////////////////////////////////////////////////////////////////////////////////////// // 写String类的构造函数时一定要注意参数问题 // 首先要考虑到构造的对象分有参数和无参数两种情况 // 构造对象的时候不能直接赋值,否则一块内存两次释放的话程序会出错 // 无参的构造函数不能将_str指针赋值为NULL,因为不能strlen(NULL) // 赋值运算符的重载要考虑到有可能分配内存失败的问题 // 当然,记得要给'\0'分配空间哦 //////////////////////////*****************//////////////////////////////////////////// #include<iostream> using namespace std; class String { public: String(char * str="") //不能strlen(NULL) :_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 ) { /* //有可能开辟空间失败,但是却破坏了_str的内容 delete[] _str; _str = new char[strlen(s._str) + 1]; strcpy(_str, s._str); */ char* tmp = new char [strlen(s ._str) + 1]; strcpy(tmp, s._str); delete[] _str; swap(_str, tmp); } return *this ; } char* CStr() { return _str; } ~String() { delete[] _str; } private: char* _str; }; //函数测试 void Test() { String s1("aaaaa" ); cout << s1.CStr() << endl; String s2(s1); cout << s2.CStr() << endl; String s3 = s1; s3= s2; cout << s3.CStr() << endl; String s4; // s4 = s1; cout << s4.CStr() << endl; } int main() { Test(); system("pause" ); return 0; }
相关文章推荐
- 一个关于if else容易迷惑的问题
- Python动态类型的学习---引用的理解
- C#中使用DataContractSerializer类实现深拷贝操作示例
- 一道sql面试题附答案
- C# 超高面试题收集整理
- C#中4种深拷贝方法介绍
- 简单谈谈C#中深拷贝、浅拷贝
- 浅拷贝和深拷贝深入理解(shallow copy VS deep copy)
- C#浅拷贝和深拷贝实例解析
- 人人网javascript面试题 可以提前实现下
- 轻松学习C#的String类
- PHP中设置一个严格30分钟过期Session面试题的4种答案
- 据说是雅虎的一份PHP面试题附答案
- php牛逼的面试题分享
- 一套比较完整的javascript面试题(部分答案)
- Javascript 浅拷贝、深拷贝的实现代码
- 10个经典的Java main方法面试题
- 小米公司JavaScript面试题
- C++拷贝构造函数(深拷贝与浅拷贝)详解
- 超级全面的PHP面试题整理集合第1/2页