/////////////////////////////////////////////////////////////////////////////////////// // 写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; }
深拷贝的传统写法
原创
©著作权归作者所有:来自51CTO博客作者言安阳的原创作品,谢绝转载,否则将追究法律责任
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
C++深拷贝和浅拷贝构造函数
深拷贝:内存拷贝,每块内存有不同的指针浅拷贝:指针的拷贝,拷贝之后指向同
拷贝构造 浅拷贝 深拷贝 -
【C++】深拷贝和浅拷贝 ④ ( 深拷贝示例 )
一、深拷贝示例1、浅拷贝问题2、自己实现深拷贝二、深拷贝完整代码示例
c++ 拷贝构造函数 深拷贝 浅拷贝 原力计划 -
c++中 拷贝构造函数的深拷贝和浅拷贝--“浅拷贝”与“深拷贝”
C++中对象的复制就如同“克隆”,用一个已有的对象快速地复制出多个完全相
c++ 深浅拷贝 c++深拷贝 构造函数的深拷贝和浅拷贝 c++浅拷贝 -
C++ 深拷贝和浅拷贝
深拷贝和浅拷贝:听名词很抽象,本质上,就是值传递和引用传递的区别值传递:指
浅拷贝 深拷贝 #include -
C++《深拷贝与浅拷贝》
由于C++提供的默认拷贝构造函数只是对对象进行浅拷贝复制(逐个成员依次拷贝),即只复制对象空间而不复制资源。
程序员 程序设计 计算机 编译器 动态