天天看點

類和動态記憶體配置設定

Part 1:

靜态類成員特點:

無論建立了多少對象,程式都隻建立一個靜态類變量副本。也就是說,類的所有對象共享一個靜态成員。

靜态資料成員在類聲明中聲明,在包含類方法的檔案中初始化。初始化時使用作用域運算符來指出靜态成員所屬的類。

但如果靜态成員是const整數類型或枚舉型,則可以在類聲明中初始化。

Part 2:在構造函數中使用new時注意事項

1、 new && delete

  1. 如果在構造函數中使用new來初始化指針成員,則應在析構函數中使用delete;
  2. new和delete必須互相相容。new對應于delete,new[]對應于delete[];
  3. 如果有多個構造函數,則必須以相同的方式使用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;

}

繼續閱讀