当同一个类实例化了类1和类2,如果用 类2 = 类1 进行复制,类2实际上不会改变自身的数据为类1,而是把类2指向的地址改为了类1的地址
这样就出现了一个问题
假设当我们使用new 或malloc分配了一段内存使用完后需要调用析构函数进行释放
你以为类1会调用~类1的析构函数 类2会调用~类2的析构函数
那就错了
因为类1和类2共同指向了类1 所以只有类1的析构函数会被调用 并且会被调用两次
这就照成了 类1的内存被释放了 ,然后类2指向了类1 又释放了一次 这就会出现错误
解决方法:
1.使用带对象参数的构造函数进行深拷贝
2.使用operator关键字重载 = 运算符 并且使用 引用接收对象参数
例:
operator =(Person1 &p)
{
delete[] this->m_Name;
this->m_Name=new char[sizeof(p.m_Name)+1];
strcpy(this->m_Name,p.m_Name);
this->are=p.are;
}
一定要使用引用方式接收参数,如果只是用Person1 p的话编译器会把栈内的地址指向已创建的对象地址,这样当我们的operator函数走完时,对象地址中的内容都会被系统回收掉
所以 我们要使用引用的方式来接收一个对象,告诉编译器,你不需要创建对象也不要直接指向对象的地址,防止你乱搞,你指向我们的中转地址,由我们的中转地址来访问p