c++中拷貝構造函數與「=」操做符重載

一.首先,若是不對一個類定義其拷貝構造函數和操做符重載的話,c++會提供兩個默認的函數。功能就是內存拷貝。在常見的應用中,這種機制就可以實現咱們想要的拷貝了,可是當類包含動態分配內存的成員時,就會出現問題,這個時候,這種默認的拷貝構造和默認的「=」重載都只是實現淺層拷貝,以指針爲例,它們只是拷貝指針的內容,而拷貝後,只是指向了同一塊內存而已。這種時候,咱們便須要重寫拷貝構造函數和「=」重載。c++

二.解決了第一個問題以後,第二個問題是,什麼狀況下會調用拷貝構造函數,什麼狀況下又是調用的「=」重載呢?函數

特此作了一組實驗。分狀況討論之。假定已經定義了類Test。指針

1.Test t1, t2(t1); 這種狀況很顯然,顯式地調用了拷貝構造函數。內存

2.Test t1;  Test t2;   t2 = t1; 這種狀況也不難判斷,顯式地調用了「=」重載。構造函數

3.Test t1; Test t2 = t1;  這種狀況有些人會覺得是賦值,因此理所固然的覺得調用的是"="重載函數,實際上是錯誤的,這種狀況調用的實際上是拷貝構造函數。咱們須要明確這是在初始化,不是在賦值。錯誤

4.函數的參數和返回值。 這種狀況調用的也是拷貝構造函數。參數

相關文章
相關標籤/搜索