简单的赋值浅拷贝 class String { public : String(const char* str) : _str(new char [strlen(str )+1]) { strcpy(_str , str); } String(const String& str) : _str(str ._str) {} String& operator =(const String& str ) { if (this != &str) { _str = str ._str; } return *this; } ~ String() { if (_str ) { delete[] _str ; } } private : char* _str ; }; void TestString () { String s1 ("hello world!"); String s2 = s1; } 当类里面有指针对象时,进行简单赋值的浅拷贝,两个对象指向同一块内存,存在崩溃的问题!这里我们要进行深拷贝。 #define _CRT_SECURE_NO_WARNINGS //#include<iostream> //using namespace std; //class String //{ //public: // //String(const char *str) :_str(new char[strlen(str)+1])//深层拷贝 // //{ // // strcpy(_str, str); // //} // String(char *str = "") :_str(new char[strlen(str)+1]) // { // strcpy(_str, str); // } // //String(String & s) // //{ // // _str = s._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 *p = _str; // _str = new char[strlen(s._str) + 1]; // delete[]p; // strcpy(_str, s._str); // // } // return *this; // } */ //传统写法 // // //现代写法 // String& operator=( String&s) // { // if (this != &s) // { // String tmp(s); // std::swap(_str, tmp._str); // } // return *this; // } // // // ~String() // { // if (_str) // delete[]_str; // } //private: // char *_str; // //}; //int main() //{ // String s1("abcd"); // String s2(s1); // String s3("qwer"); // s3 = s1; // String s4; // s4 = s3; // return 0; //} #include<iostream>// 引用计数 using namespace std; class String { public: String(char *str = "") :_str(new char[strlen(str) + 1]), _refCount(new int(1)) { strcpy(_str, str); } String(const String& s) { _str = s._str; _refCount = s._refCount; ++*_refCount; } ~String() { if (--*_refCount == 0) delete[]_str; } private: char *_str; int *_refCount;// }; int main() { String s1("abcde"); String s2(s1); String s3("qwer"); String s4(s3); return 0; }
c++ 深浅拷贝(传统写法 现代写法)
原创性感的玉米 ©著作权
文章标签 c++ 深浅拷贝的实现(传统写法 现代 文章分类 C/C++ 后端开发
上一篇:c++ 写时拷贝
![](https://ucenter.51cto.com/images/noavatar_middle.gif)
-
【C语言】【面试题】C++中String类浅拷贝,深拷贝的传统写法与现代写法
本文主要给出了String类的浅拷贝写法及思路,深拷贝的传统写法和现代写法,分析了一下每种写法的优缺点
C语言 String类的浅拷贝 深拷贝的传统写法和现代写法 -
归并排序的递归迭代写法(C++)
-
c++ 排序算法 i++ 数组 #include -
c++ string 另类写法
#include <string>#include <iostream>#include <stdio.h>using namespace std;int main(){ string strOutput = "Hello World"; cout
c++ visual studio 开发语言 #include ios -
【C语言】【面试题】C++中String类引用计数器的浅拷贝写法与深拷贝写法
Linux操作下String类的实现--引用计数器 1.引用计数器写法一写法一个人比较喜欢叫他双指针法,因为他是在类里面创建了两个指针来实现的一个是指针_str,另外一个是用来保存指向同一块空间个数的指针_pRefCount.class String{public: String(char*
C语言 String类的Linux操作平台实现方 引用计数器的两种写法 引用计数器的正常写法与改进写法