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

來源:互聯網
上載者:User

類String的賦值函數比建構函式複雜得多,分四步實現:

(1)第一步,檢查自賦值。你可能會認為多此一舉,難道有人會愚蠢到寫出 a = a 這樣的自指派陳述式!的確不會。但是間接的自賦值仍有可能出現,例如

// 內容自賦值

b = a;

c = b;

a = c;
// 地址自賦值

b = &a;

a = *b;


也許有人會說:“即使出現自賦值,我也可以不理睬,大不了化點時間讓對象複製自己而已,反正不會出錯!”

他真的說錯了。看看第二步的delete,自殺後還能複製自己嗎?所以,如果發現自賦值,應該馬上終止函數。注意不要將檢查自賦值的if語句

if(this == &other)

錯寫成為

if( *this == other)

(2)第二步,用delete釋放原有的記憶體資源。如果現在不釋放,以後就沒機會了,將造成記憶體泄露。

(3)第三步,分配新的記憶體資源,並複製字串。注意函數strlen返回的是有效字串長度,不包含結束符‘\0’。函數strcpy則連‘\0’一起複製。

(4)第四步,返回本對象的引用,目的是為了實現象 a = b = c 這樣的鏈式表達。注意不要將 return *this 錯寫成 return this 。那麼能否寫成return other 呢?效果不是一樣嗎?

不可以!因為我們不知道參數other的生命期。有可能other是個臨時對象,在賦值結束後它馬上消失,那麼return other返回的將是垃圾。

9.7 偷懶的辦法處理拷貝建構函式與賦值函數
如果我們實在不想編寫拷貝建構函式和賦值函數,又不允許別人使用編譯器產生的預設函數,怎麼辦?

偷懶的辦法是:只需將拷貝建構函式和賦值函式宣告為私人函數,不用編寫代碼。

例如:

class A

{ …

private:

A(const A &a); // 私人的拷貝建構函式

A & operate =(const A &a); // 私人的賦值函數

};

如果有人試圖編寫如下程式:

A b(a); // 調用了私人的拷貝建構函式

b = a; // 調用了私人的賦值函數

編譯器將指出錯誤,因為外界不可以操作A的私人函數。

9.8 如何在衍生類別中實作類別的基本函數
基類的建構函式、解構函式、賦值函數都不能被衍生類別繼承。如果類之間存在繼承關係,在編寫上述基本函數時應注意以下事項:

u 衍生類別的建構函式應在其初始化表裡調用基類的建構函式。

u 基類與衍生類別的解構函式應該為虛(即加virtual)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.