☆深拷贝函数主要是解决拷贝函数不能直接拷贝指针所指内存的数据的问题:
其次,介绍一下什么是拷贝构造函数以及拷贝构造函数将在何时被调用?
拷贝构造函数是一种特殊的构造函数,其形参是本类对象的引用,其作用是使用一个已经存在的对象来初始化
一个新的同类的对象。
何时被调用?
① 当用类的对象去初始化另外一个对象的时候;
② 当函数的形参为类对象时,调用该函数时,实参赋值给形参;
③ 当函数的返回值是类对象时。
************************************************************************************************************************************
一:浅拷贝
1> 首先给出一个demo源码
#include <iostream>
using namespace std;
class A
{
private:
int count;
int *p;
public:
A(int x)
{
count = x;
p = new int[x];
}
A(A &a)
{
this->count = a.count;
this->p = a.p;
}
~A()
{
delete[] p;
}
int Putcount()
{
return count;
}
};
int main()
{
A a1(5);
A a2(a1);
cout << a1.Putcount() << endl;
cout << a2.Putcount() << endl;
return 0;
}
2>运行结果及分析:
为什么程序到这会崩溃?
因为上述demo中在拷贝函数对指针的拷贝后,使得两个实例化出的类的对象指向了同一个内存地址,
然后在默认的析构函数调用的时候,同一个内存地址被释放了两次,然后程序就崩溃了。
为了解决这种问题,也就出现了深拷贝,主要是为不同的对象开辟不同的内存空间,而不是直接让两个指针直接指向了一个内存地址:
二:深拷贝
1>源码
#include <iostream>
using namespace std;
class A
{
private:
int count;
int *p;
public:
A(int x)
{
count = x;
p = new int[x];
}
A(A &a)
{
this->count = a.count;
this->p = new int[count];
for (int i = 0; i < count; i++)
{
this->p[i] = a.p[i];
}
}
~A()
{
delete[] p;
}
int Putcount()
{
return count;
}
};
int main()
{
A a1(5);
A a2(a1);
cout << a1.Putcount() << endl;
cout << a2.Putcount() << endl;
return 0;
}
2>运行结果及分析
分析:
这里在拷贝构造函数中首先实例化了指针的内存地址,然后再进行逐个复制,这就是深拷贝,完美的解决了浅拷贝的问题。