#include<iostream>
using namespace std;
class Teacher
{
public:
Teacher(int id,char *name)
{
cout << "Teacher(int id,char *)" << endl;
//赋值id
m_id = id;
//赋值name
int len = strlen(name);
m_name = (char*)malloc(len + 1);//+1,因为与C语言一样有字符串有\0
strcpy(m_name,name);
}
void printT()
{
cout << "id = " << m_id << ", name = " << m_name << endl;
}
//提供一个显式的拷贝构造函数,来完成深拷贝动作
Teacher (const Teacher &another)
{
m_id = another.m_id;
//深拷贝动作
int len = strlen(another.m_name);
m_name =(char*)malloc(len + 1);
strcpy(m_name,another.m_name);
}
~Teacher() {
cout << "~Teacher()..." << endl;
if (m_name !=NULL)
{
free(m_name);
m_name = NULL;
}
}
private:
int m_id;
char *m_name;
//只要成员中指针,就需要手动提供一个显式的拷贝构造函数
//来完成深拷贝动作,防止出现危险的浅拷贝
};
void test()
{
Teacher t1(1,"zhangsan");
t1.printT();
Teacher t2(t1);
//发生了浅拷贝,由于t2的析构的同时,也释放了t1,t2都指向的堆空间
//轮到t1再去析构,堆空间不存在,非法空间,故发生断错误奔溃
t2.printT();
}
int main()
{
test();
return 0;
}
浅拷贝结果:
深拷贝结果:
总结:
只要成员中用指针,就需要手动提供一个显式的拷贝构造函数,来完成深拷贝动作,防止出现危险的浅拷贝。
危险如:由于发浅拷贝,t2的析构的同时,也释放了t1,t2都指向的堆空间
轮到t1再去析构,堆空间不存在,非法空间,故发生断错误奔溃。