Part 1:
靜态類成員特點:
無論建立了多少對象,程式都隻建立一個靜态類變量副本。也就是說,類的所有對象共享一個靜态成員。
靜态資料成員在類聲明中聲明,在包含類方法的檔案中初始化。初始化時使用作用域運算符來指出靜态成員所屬的類。
但如果靜态成員是const整數類型或枚舉型,則可以在類聲明中初始化。
Part 2:在構造函數中使用new時注意事項
1、 new && delete
- 如果在構造函數中使用new來初始化指針成員,則應在析構函數中使用delete;
- new和delete必須互相相容。new對應于delete,new[]對應于delete[];
- 如果有多個構造函數,則必須以相同的方式使用new,要麼都帶中括号,要麼都不帶,因為隻有一個析構函數,所有的構造函數都必須與它相容;然而,可以在一個構造函數裡使用new初始化指針,而在另一個構造函數裡将指針初始化為空,這是因為delete可以用于空指針。
2、 Demo
class Act{…};
…
Act nice【1】; //外部對象
…
int main()
{
Act *pt【2】=new Act; //動态對象
…
{
Act up【3】; //自動化對象
}
…
delete pt;
}
說明:
【3】執行到定義代碼塊末尾時,将調用自動對應的up的析構函數
【2】對指針pt應用運算符delete時,将調用動态對象*pt的析構函數
【1】 整個程式結束時,将調用靜态對象nice的析構函數
如果對象是靜态變量,則在程式結束時将調用對象的析構函數。
Part 3: 複制構造函數
應定義一個複制構造函數,通過深度複制将一個對象初始化為另一個對象。
具體來說:複制構造函數應配置設定足夠的空間來存儲複制的資料,并複制資料,而不僅僅是資料的位址;另外,還應該更新所有受影響的靜态類成員。
應當定義一個指派運算符,通過深度複制将一個對象複制給另一個對象。
Demo:
String::String(const String & st) //st是新的對象
{
num_string++; //靜态成員變量
len=st.len;
str=new char[len+1];
std::strcpy(str,st.str);
}
String & String::operator=(const String & st)
{
if(this == &st)
{
return *this;
}
delete[] str;
len=st.len;
str=new char[len+1];
std::strcpy(str,st_str);
return *this;
}