1.浅拷贝
又称值拷贝 ,将源对象的值拷贝到目标对象中去,本质上来说源对象和目标拷贝对象共用一个内存空间,只是所引用的变量名不同,地址其实还是相同的。 类似于c++中的引用,对同一块地址用不同的名字指向它。
#include<iostream>
#include<string>
using namespace std;
namespace mystring
{
class string
{
public:
string(const char* str = "")
:_str(new char[strlen(str)+1])
{
strcpy(_str, str);
}
string& operator=(const string& s)
{
_str = s._str;
}
char& operator[](int i)
{
return _str[i];
}
const char* c_str()
{
return _str;
}
private:
char* _str;
};
}
int main()
{
mystring::string str1("Hello World!\n");
mystring::string str2 = str1;
str2[0] = 'h';
cout << str1.c_str()<< endl;
cout << str2.c_str() << endl;
}
用浅拷贝的方式 将str1的内容拷贝给str2;
当改变str2[0]的字符为‘h’以后同时输出str1和str2都是"hello world!"。
一旦对str2进行操作,str1的内容也会改变
2.深拷贝
通过开辟和原空间大小相同的空间并将内容拷贝再进行操作。不论是否对str1进行操作,都会拷贝一片相同大小的空间以及内容下来。
#include<iostream>
using namespace std;
class Person
{
public:
Person(string name,int age)
{
this->m_Name = name;
this->m_Age = new int(age);
}
Person(const Person& p)
{
this->m_Name = p.m_Name;
this->m_Age = new int(*p.m_Age);
}
~Person()
{
if (this->m_Age!=NULL)
{
delete this->m_Age;
this->m_Age = NULL;
}
}
string m_Name;
int* m_Age;
};
void test01()
{
Person p1("小明",20);
Person p2(p1);
cout << p2.m_Name << " " << *p2.m_Age << endl;
}
int main()
{
test01();
system("pause");
return 0;
}
深拷贝操作使p1与p2指向不同的内存空间,p2单独指向自己申请的内存。