關於複製建構函式

2021-04-02 06:52:23 字數 1797 閱讀 2882

也許很多

c++的初學者都知道什麼是建構函式,但是對複製建構函式(

copy constructor

)卻還很陌生。對於我來說,在寫**的時候能用得上覆制建構函式的機會並不多,不過這並不說明複製建構函式沒什麼用,其實複製建構函式能解決一些我們常常會忽略的問題。

為了說明複製建構函式作用,我先說說我們在程式設計時會遇到的一些問題。對於

c++中的函式,我們應該很熟悉了,因為平常經常使用;對於類的物件,我們也很熟悉,因為我們也經常寫各種各樣的類,使用各種各樣的物件;對於指標的操作,我們也不陌生吧?嗯,如果你還不了解上面三個概念的話,我想這篇文章不太適合你,不過看看也無礙

^_^。我們經常使用函式,傳遞過各種各樣的引數給函式,不過把物件(注意是物件,而不是物件的指標或物件的引用)當作引數傳給函式的情況我們應該比較少遇見吧,而且這個物件的建構函式還涉及到一些記憶體分配的操作。嗯,這樣會有什麼問題呢?

把 引數傳遞給函式有三種方法,一種是值傳遞,一種是傳位址,還有一種是傳引用。前者與後兩者不同的地方在於:當使用值傳遞的時候,會在函式裡面生成傳遞引數 的乙個副本,這個副本的內容是按位從原始引數那裡複製過來的,兩者的內容是相同的。當原始引數是乙個類的物件時,它也會產生乙個物件的副本,不過在這裡要 注意。一般物件產生時都會觸發建構函式的執行,但是在產生物件的副本時卻不會這樣,這時執行的是物件的複製建構函式。為什麼會這樣?嗯,一般的建構函式都 是會完成一些成員屬性初始化的工作,在物件傳遞給某一函式之前,物件的一些屬性可能已經被改變了,如果在產生物件副本的時候再執行物件的建構函式,那麼這 個物件的屬性又再恢復到原始狀態,這並不是我們想要的。所以在產生物件副本的時候,建構函式不會被執行,被執行的是乙個預設的建構函式。當函式執行完畢要 返回的時候,物件副本會執行析構函式,如果你的析構函式是空的話,就不會發生什麼問題,但一般的析構函式都是要完成一些清理工作,如釋放指標所指向的記憶體 空間。這時候問題就可能要出現了。假如你在建構函式裡面為乙個指標變數分配了記憶體,在析構函式裡面釋放分配給這個指標所指向的記憶體空間,那麼在把物件傳遞 給函式至函式結束返回這一過程會發生什麼事情呢?首先有乙個物件的副本產生了,這個副本也有乙個指標,它和原始物件的指標是指向同塊記憶體空間的。函式返回 時,物件的析構函式被執行了,即釋放了物件副本裡面指標所指向的記憶體空間,但是這個記憶體空間對原始物件還是有用的啊,就程式本身而言,這是乙個嚴重的錯 誤。然而錯誤還沒結束,當原始物件也被銷毀的時候,析構函式再次執行,對同一塊系統動態分配的記憶體空間釋放兩次是乙個未知的操作,將會產生嚴重的錯誤。

上 面說的就是我們會遇到的問題。解決問題的方法是什麼呢?首先我們想到的是不要以傳值的方式來傳遞引數,我們可以用傳位址或傳引用。沒錯,這樣的確可以避免 上面的情況,而且在允許的情況下,傳位址或傳引用是最好的方法,但這並不適合所有的情況,有時我們不希望在函式裡面的一些操作會影響到函式外部的變數。那 要怎麼辦呢?可以利用複製建構函式來解決這一問題。複製建構函式就是在產生物件副本的時候執行的,我們可以定義自己的複製建構函式。在複製建構函式裡面我 們申請乙個新的記憶體空間來儲存建構函式裡面的那個指標所指向的內容。這樣在執行物件副本的析構函式時,釋放的就是複製建構函式裡面所申請的那個記憶體空間。

除了將物件傳遞給函式時會存在以上問題,還有一種情況也會存在以上問題,就是當函式返回物件時,會產生乙個臨時物件,這個臨時物件和物件的副本性質差不多。

關於複製建構函式的性質還有很多,不過一時說不清楚,頭腦還比較亂。

^_^c++

真是複雜,不過複雜得來還挺有意思。

c++真是複雜,不過複雜得來還挺有意思。

感覺自己的表達能力還很欠缺,我自己是比較明白什麼是複製建構函式以及它的作用的,但是這篇文章卻說得不清不楚.一般來說程式設計師都有很強的思維邏輯能力,但在表達能力方面還是需要鍛鍊的.也許多寫寫類似的文章能夠改善自己在表達這一方面的能力吧.

關於sizeof 與 複製建構函式

來自 劍指offer 名企面試官精講典型程式設計題 sizeof 1.定義乙個空的型別,裡面沒有任何成員變數和成員函式。對該型別求sizeof,得到的結構式多少?答 答案是1 2.為什麼不是0?答 空型別的例項中不包含任何資訊,本來求sizeof應該是0,但是當我們宣告該型別的例項的時候,它必須在記...

複製建構函式

今天回看了前面的內容,發現這一章掌握的不夠好,就重看了一遍,順便總結一下 無規律總結 複製建構函式用於複製物件,即可以初始化物件,也可以將複製得到的物件作為實參傳遞給函式,多用於初始化。當我們這樣寫 string null bulk 9 9 9 9 在建立null bulk時編譯器先呼叫string...

複製建構函式

拷貝建構函式的標準寫法如下 class base base const base b 上述寫法見得最多,甚至你認為理所當然。那麼如果我們不寫成引用傳遞呢,而是值傳遞,那麼會怎樣?class base base const base b 編譯出錯 error c2652 base illegal co...