在C++中创建一个类时,默认情况下,编译器会自动调用构造函数和析构函数。其中,构造函数包括默认构造函数(无参)、有参构造函数和拷贝构造函数。
在调用拷贝构造函数时,可能会遇到深拷贝与浅拷贝问题。拷贝构造函数默认为浅拷贝,即仅仅将传入的对象的内容简单地复制到新创建的对象上。
因此,浅拷贝的问题在于:如果我们在写类时将一块内存开辟在堆区,并在析构函数中写了程序运行结束后即释放它的代码,浅拷贝时就可能会有多个对象中的指针变量指向同一片区域。而每一个对象在函数运行结束后都会被析构函数所清除,此时因为每次调用析构函数、该片内存都会被释放一次,所以这片内存就会被释放多次。这是非法的操作。
所以,为避免这种情况。我们应该进行深拷贝。即在类中有指针变量的情况下,每次调用拷贝构造函数时,都为这个新对象申请新的地址,通过拷贝这些不同的地址指向的内存中使内容相同。
#include<iostream>
using namespace std;
class temp{
public:
temp(int a, int p)
{
num = a;
ptr = new int(p);
cout<<"有参构造函数"<<endl;
}
temp(const temp& b)
{
num = b.num;
//重点!为新创建的对象申请开辟新的内存,但其中数据一样。
ptr = new int(*b.ptr);
cout<<"拷贝构造函数"<<endl;
}
~temp()
{
//释放内存
delete ptr;
cout<<"析构函数"<<endl;
}
int num;
int* ptr;
};
//用于测试的打印函数
void test()
{
temp one(20, 10);
temp two(one);
cout<<one.num<<*one.ptr<<endl;
cout<<two.num<<*two.ptr<<endl;
}
int main()
{
test();
}``
输出结果:
有参构造函数
拷贝构造函数
2010
2010
析构函数
析构函数