本文分析 等號在何時會調用默認拷貝構造函數,何時是複製。
Name obj1("abcdefg");
Name obj2 = obj1; //此處不是賦值,會調用copy構造函數
Name obj3("obj3");
obj3 = obj1; // 此處的=爲複製obj1的數據,不調用copy構造函數
也就是說當obj不存在的時候去=對象的時候就會調用構造函數。
當一個存在的對象去=的時候就爲賦值,因爲已經存在了嘛,所以不會調用構造函數
class Name
{
public:
Name(const char *myp)
{
m_len = strlen(myp);
m_p =(char *) malloc(m_len + 1);
strcpy(m_p, myp);
}
//解決方案: 手工的編寫拷貝構造函數 使用深copy
Name(const Name& obj1)
{
m_len = obj1.m_len;
m_p = (char *)malloc(m_len + 1);
strcpy(m_p, obj1.m_p);
}
//obj3 = obj1; // C++編譯器提供的 等號操作 也屬 淺拷貝
//obj3.operator=(obj1)
/*
Name& operator=(Name &obj1) // 重載等號運算符
{
//先釋放舊的內存
if (this->m_p != NULL)
{
delete[] m_p;
m_len = 0;
}
//2 根據obj1分配內存大小
this->m_len = obj1.m_len;
this->m_p = new char [m_len+1];
//把obj1賦值
strcpy(m_p, obj1.m_p);
return *this;
}
*/
~Name()
{
if (m_p != NULL)
{
free(m_p);
m_p = NULL;
m_len = 0;
}
}
protected:
private:
char *m_p ;
int m_len;
};
//對象析構的時候 出現coredump
void objplaymain()
{
int a=0;
Name obj1("abcdefg");
Name obj2 = obj1; //C++編譯器提供的 默認的copy構造函數 淺拷貝
Name obj3("obj3");
obj3 = obj1; // C++編譯器提供的 等號操作 也屬 淺拷貝
//obj3.operator=(obj1)
//operato=(Name &obj1)
//obj1 = obj2 = obj3;
//obj2.operator=(obj3);
//obj1 = void;
a=4;
}
int main()
{
char a=0;
objplaymain();
system("pause");
// a = cin.get();
return 0;
}