/*
默認複製構造函數可以完成對象的數據成員值簡單的複製
對象的數據資源是由指針指示的堆時,默認複製構造函數僅作指針值複製
淺拷貝程序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