一.浅拷贝
特点:直接拷贝
#define _CRT_SECURE_NO_WARNINGS
#include<iostream> //浅拷贝
#include<string.h>
using namespace std;
class String
{
public:
String(const char *pstr = "") //构造函数
{
if (pstr == NULL) //如果指针为空,就开辟一个字节空间,放入斜杠0;
{
_pstr = new char[1];
*_pstr = '\0';
}
_pstr = new char[strlen(pstr) + 1];//strlen不含斜杠0
strcpy (_pstr ,pstr);
}
String & operator=(const String &s) //赋值运算符的重载
{
if (this != &s)
{
_pstr = s._pstr;
}
return *this;
}
String(const String &s)
:_pstr(s._pstr)
{
}
~String() //析构函数
{
if (NULL != _pstr)
{
delete[] _pstr;
_pstr = NULL;
}
}
private:
char *_pstr;
};
void funtest()
{
String s1;
String s2 = "hello";
String s3 = "meet";
s2 = s3;
{
public:
String(const char *pstr = "") //构造函数
{
if (pstr == NULL) //如果指针为空,就开辟一个字节空间,放入斜杠0;
{
_pstr = new char[1];
*_pstr = '\0';
}
_pstr = new char[strlen(pstr) + 1];//strlen不含斜杠0
strcpy (_pstr ,pstr);
}
String & operator=(const String &s) //赋值运算符的重载
{
if (this != &s)
{
_pstr = s._pstr;
}
return *this;
}
String(const String &s)
:_pstr(s._pstr)
{
}
~String() //析构函数
{
if (NULL != _pstr)
{
delete[] _pstr;
_pstr = NULL;
}
}
private:
char *_pstr;
};
void funtest()
{
String s1;
String s2 = "hello";
String s3 = "meet";
s2 = s3;
}
int main()
{
funtest();
return 0;
}
int main()
{
funtest();
return 0;
}
运行结果:
通过运行结果我们发现代码崩溃了,还能看到崩溃的地方正好就是我们释放空间的时候,那么为什么会崩溃呢,一起来分析一下。
那么我们应该怎么去解决这个问题呢?浅拷贝的时候,因为不知道还有“人”要用这块空间呢就给释放了,那么我们是不是可以用个计数器来把要用这块空间的“人”记住呢,直到计数器减为0的时候,说明没“人”用了,在释放,就不会出现崩溃的问题了,这个问题我们在之后会拿出来并解决。
二.深拷贝
特点:在拷贝的时候开辟新的空间,就不会出现浅拷贝中出现的问题了
#define _CRT_SECURE_NO_WARNINGS
#include<iostream> //深拷贝
#include<string.h>
#include<stdlib.h>
#include<iostream> //深拷贝
#include<string.h>
#include<stdlib.h>
using namespace std;
class String
{
public:
friend ostream& operator<< (ostream&_cout, String &s)
{
_cout << s._pstr;
return _cout;
}
String(const char *pstr = "") //构造函数
{
if (pstr == NULL)
{
_pstr = new char[1];
*_pstr = '\0';
}
else
{
_pstr = new char[strlen(pstr) + 1];
strcpy (_pstr , pstr);
}
class String
{
public:
friend ostream& operator<< (ostream&_cout, String &s)
{
_cout << s._pstr;
return _cout;
}
String(const char *pstr = "") //构造函数
{
if (pstr == NULL)
{
_pstr = new char[1];
*_pstr = '\0';
}
else
{
_pstr = new char[strlen(pstr) + 1];
strcpy (_pstr , pstr);
}
}
String &operator=(String &s)//赋值运算符的重载
{
if (this != &s)
{
//_pstr = s._pstr;
char *temp = new char[strlen(s._pstr) + 1];
strcpy (temp,s._pstr);
_pstr = temp;
}
return *this;
}
String(const String &s) //拷贝构造
{
char *temp = new char[strlen(s._pstr) + 1];
strcpy (temp, s._pstr);
_pstr = temp;
}
~String()
{
delete[]_pstr;
_pstr = NULL;
}
private:
char *_pstr;
//int count;
};
void funtest()
{
String s1;
String s2 = "hello";
String s3 = "meet";
s1 = s2;
s2 = s3;
cout << s1 << endl;
cout << s2 << endl;
}
int main()
{
funtest();
system("pause");
return 0;
}
String &operator=(String &s)//赋值运算符的重载
{
if (this != &s)
{
//_pstr = s._pstr;
char *temp = new char[strlen(s._pstr) + 1];
strcpy (temp,s._pstr);
_pstr = temp;
}
return *this;
}
String(const String &s) //拷贝构造
{
char *temp = new char[strlen(s._pstr) + 1];
strcpy (temp, s._pstr);
_pstr = temp;
}
~String()
{
delete[]_pstr;
_pstr = NULL;
}
private:
char *_pstr;
//int count;
};
void funtest()
{
String s1;
String s2 = "hello";
String s3 = "meet";
s1 = s2;
s2 = s3;
cout << s1 << endl;
cout << s2 << endl;
}
int main()
{
funtest();
system("pause");
return 0;
}
运行结果:
可以看到,我们深拷贝解决了浅拷贝的问题,让我们能成功的将程序运行出来。