构造函数主要分为:默认构造函数和有参构造函数;构造函数又分为:普通的构造函数和copy构造函数(需传入自身的对象)
利用自己定义的构造函数解决浅拷贝所带来的潜在的析构过程中的bug。
改程序中主要是利用重写copy构造函数,通过给对象在自由存储区(堆)重新分配自己的存储空间,来实现深copy,从而避免上述所提到的潜在bug。
#include <iostream>
using namespace std;
class Name
{
public:
Name(const char *myp)
{
m_len = strlen(myp);
m_p = (char *) malloc (m_len + 1); //给指针分配内容空间
strcpy(m_p, myp);
}
//Name obj2 = obj1;
//手动解决拷贝构造函数,使用深copy
//指针的真正用武之地就是在运行时分配未命名的内存来储存值;c语言中使用malloc来分配,c++使用new运算符
Name(const Name & obj1)
{
m_len = obj1.m_len;
m_p = (char *)malloc(m_len + 1); //给指针分配内容空间
strcpy(m_p, obj1.m_p);
}
~Name()
{
if(m_p != NULL)
{
free(m_p);//释放的不是指针,而是指针指向的内容空间,如果是浅拷贝的话,则释放第二次的时候,容易报错。
m_p = NULL;
m_len = 0;
}
}
protected:
private:
char *m_p;
int m_len;
};
void objdisplaymain()
{
Name obj1("abcdefg");
Name obj2 = obj1; //默认的copy构造函数 C++编译器给我们提供的
}
//在程序调用结束时,会调用析构函数来回收内存,析构掉obj1和obj2两个对象。根据析构函数的操作,浅拷贝会出现bug
int main()
{
objdisplaymain();
cout << "hello..." << endl;
return 0;
}