1.構造函數:初始化對象所佔內存空間(成員變量)
函數名與類名相等,不需要返回值
字符串賦值:需要開闢內存空間
mname = new char [strlen(name) + 1]();//對象在棧上開闢(由系統開闢和釋放),而對象中的內容在堆上開闢。堆內存由用戶 開闢和釋放
strcpy(mname,name);
1.this指針:指向對象所佔的內存(不允許修改)
2.構造析構順序:先構造的後析構(符合棧的特性先進後出)
3.構造函數和析構函數能不能重載
1.構造函數:可以重載
2.析構函數:不可重載
4.構造函數和析構函數能不能自己調用
構造函數:不可以自己調用
類的成員方法
依賴對象調用
構造函數完成後
5.默認的構造函數 默認的析構函數
CGood()
{
}
~CGood()
{
}
1.用戶提供後 系統將不會提供
2.默認構造調用方式
CGood good4; //對象生成 不加括號 調用默認構造函數
CGood good4();//函數聲明
2.析構函數:釋放對象所佔資源
釋放堆內存
可以自己實現調用 但不建議調用(系統會自己調用)
調用後會退化成一個普通的成員方法
並且系統還會再調用一個析構函數
即同一段內存被釋放兩次(可能出現異常)
3.拷貝構造函數:
1.用一個已存在的對象構造一個相同類型的新對象
2.形參必須使用引用對象//防止死遞歸
3.默認拷貝構造函數
是一個淺拷貝,如果有指針類型存在,考慮是否實現深拷貝
淺拷貝:
CGoods(const CGoods& rhs)
{
mname = rhs.name // 多個指針指向同一段內存
mprice = rhs.mprice;
mamout = rhs.mamout;
}
深拷貝:
CGoods(const CGoods& rhs)
{
mname = new char[strlen(rhs.name)+1]();
strcpy(mname,rhs.mname);
mprice = rhs.mprice;
mamout = rhs.mamout;
}
4.賦值運算符的重載函數:
1.作用:用一個已存在的對象給另一個相同類型已存在的對象賦值
2.形參使用常引用const的作用:1.防止修改實參的值
2.接收隱式生成的臨時對象
3.設計流程:1.自賦值判斷
2.釋放舊資源
3.開闢新資源
4.賦值
自賦值判斷
if(this == &rhs)
{
return *this;
}
CGoods & operator=(const CGoods &rhs)
{
cout<<this<<" :CGoods::operator= (CGoods)"<<endl;
if(this != &rhs)
{
delete[] mname;
mname = new char[strlen(rhs.mname)+1]();
strcpy(mname,rhs.mname);
mprice = rhs.mprice;
mamout = rhs.mamout;
}
return *this;
}