#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
#include<string.h>
#if 0
//简单的赋值浅拷贝
class String
{
public:
String(const char* str)
:_str(new char[strlen(str) + 1])
{
if(_str) //检查开辟空间是否成功
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; //s1和s2指向同一块内存,析构时delete了两次这块内存
}
int main()
{
TestString();
return 0;
}
//程序在第二次析构的时候奔溃
//当类里面有指针对象时,进行简单赋值的浅拷贝,两个对象指向同一块内存,
//存在崩溃的问题!这里我们要进行深拷贝
#endif
#if 1
//深拷贝
//重新开辟了同样大小的空间,然后再将值拷贝过去。
class String
{
public:
String(const char* str)
:_str(new char[strlen(str) + 1])
{
if (_str)
strcpy(_str, str);
}
String(const String& s)
:_str(new char[strlen(s._str) + 1])
{
if (_str)
strcpy(_str, s._str);
}
String& operator=(const String& s)
{
if (this != &s)
{
_str = new char[strlen(s._str)+1];
if (_str)
strcpy(_str, s._str);
}
return *this;
}
~String()
{
if (_str)
{
delete[] _str;
}
}
private:
char* _str;
};
int main()
{
String s1("hello world!");
String s2(s1);
String s3 = s1;
return 0;
}
#endif
深浅拷贝
最新推荐文章于 2025-04-22 14:57:14 发布