/*
默认复制构造函数可以完成对象的数据成员值简单的复制
对象的数据资源是由指针指示的堆时,默认复制构造函数仅作指针值复制
浅拷贝程序C++提供的解决方法:
显示提供copy构造函数
显示操作重载=号操作,不使用编译器提供的浅copy
*/
#if 1
class Name
{
public:
//构造函数
Name(const char *myp)
{
m_len = strlen(myp);
m_p = (char *)malloc(m_len + 1);
strcpy(m_p, myp);
}
//Name t2 = t1;
//解决方案:手工的编写拷贝构造函数 使用深copy
Name(const Name& obj)
{
m_len = obj.m_len;
m_p = (char *)malloc(m_len + 1);
strcpy(m_p, obj.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 test()
{
Name t1("hello world"); //调用无参构造函数
Name t2 = t1;//c++编译器提供的默认拷贝构造函数 是 浅拷贝,多次释放 同一块内存
//----------------------------------------------------------
Name t3("hhhh");
//t3 = t1; // = 操作 把对象1的属性 拷贝给对象3 是浅拷贝,多次释放 同一块内存,还有一块内存未释放
//需要解决重载 = 操作符
cout << "hello..." << endl;
}
#endif

