高品質C++/C編程指南-第9章-類的建構函式、解構函式與賦值函數(3)

來源:互聯網
上載者:User

9.3 構造和析構的次序
構造從類層次的最根處開始,在每一層中,首先調用基類的建構函式,然後調用成員對象的建構函式。析構則嚴格按照與構造相反的次序執行,該次序是唯一的,否則編譯器將無法自動執行析構過程。

一個有趣的現象是,成員對象初始化的次序完全不受它們在初始化表中次序的影響,只由成員對象在類中聲明的次序決定。這是因為類的聲明是唯一的,而類的建構函式可以有多個,因此會有多個不同次序的初始化表。如果成員對象按照初始化表的次序進行構造,這將導致解構函式無法得到唯一的逆序。[Eckel, p260-261]

9.4 樣本:類String的建構函式與解構函式
// String的普通建構函式

String::String(const char *str)

{

if(str==NULL)

{

m_data = new char[1];

*m_data = ‘\0’;

}

else

{

int length = strlen(str);

m_data = new char[length+1];

strcpy(m_data, str);

}

}

// String的解構函式

String::~String(void)

{

delete [] m_data;

// 由於m_data是內部資料類型,也可以寫成 delete m_data;

}

9.5 不要輕視拷貝建構函式與賦值函數
由於並非所有的對象都會使用拷貝建構函式和賦值函數,程式員可能對這兩個函數有些輕視。請先記住以下的警告,在閱讀本文時就會多心:

u 本章開頭講過,如果不主動編寫拷貝建構函式和賦值函數,編譯器將以“位拷貝”的方式自動產生預設的函數。倘若類中含有指標變數,那麼這兩個預設的函數就隱含了錯誤。以類String的兩個對象a,b為例,假設a.m_data的內容為“hello”,b.m_data的內容為“world”。

現將a賦給b,預設賦值函數的“位拷貝”意味著執行b.m_data = a.m_data。這將造成三個錯誤:一是b.m_data原有的記憶體沒被釋放,造成記憶體泄露;二是b.m_data和a.m_data指向同一塊記憶體,a或b任何一方變動都會影響另一方;三是在對象被析構時,m_data被釋放了兩次。

u 拷貝建構函式和賦值函數非常容易混淆,常導致錯寫、錯用。拷貝建構函式是在對象被建立時調用的,而賦值函數只能被已經存在了的對象調用。以下程式中,第三個語句和第四個語句很相似,你分得清楚哪個調用了拷貝建構函式,哪個調用了賦值函數嗎?

String a(“hello”);

String b(“world”);

String c = a; // 調用了拷貝建構函式,最好寫成 c(a);

c = b; // 調用了賦值函數

本例中第三個語句的風格較差,宜改寫成String c(a) 以區別於第四個語句。

9.6 樣本:類String的拷貝建構函式與賦值函數
// 拷貝建構函式

String::String(const String &other)

{

// 允許操作other的私人成員m_data

int length = strlen(other.m_data);

m_data = new char[length+1];

strcpy(m_data, other.m_data);

}

// 賦值函數

String & String::operate =(const String &other)

{

// (1) 檢查自賦值

if(this == &other)

return *this;

// (2) 釋放原有的記憶體資源

delete [] m_data;

// (3)分配新的記憶體資源,並複製內容

int length = strlen(other.m_data);

m_data = new char[length+1];

strcpy(m_data, other.m_data);

// (4)返回本對象的引用

return *this;

}

類String拷貝建構函式與普通建構函式(參見9.4節)的區別是:在函數入口處無需與NULL進行比較,這是因為“引用”不可能是NULL,而“指標”可以為NULL。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.