您的位置:首页 > 编程语言 > C语言/C++

c++ 深浅拷贝(传统写法 xain'dai'xie'fa)

2016-03-12 13:30 447 查看
简单的赋值浅拷贝
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;
}




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息