是雖然使用了"=",但是實際上使用物件p來建立乙個新的物件p1。也就是產生了新的物件,所以呼叫的是拷貝建構函式。
首先宣告乙個物件p2,然後使用賦值運算子"=",將p的值複製給p2,顯然是呼叫賦值運算子,為乙個已經存在的物件賦值 。
說到拷貝建構函式,就不得不提深拷貝和淺拷貝。通常,預設生成的拷貝建構函式和賦值運算子,只是簡單的進行值的複製。例如:上面的person
類,字段只有int
和string
兩種型別,這在拷貝或者賦值時進行值複製建立的出來的物件和源物件也是沒有任何關聯,對源物件的任何操作都不會影響到拷貝出來的物件。反之,假如person
有乙個物件為int *
,這時在拷貝時還只是進行值複製,那麼建立出來的person
物件的int *
的值就和源物件的int *
指向的是同乙個位置。任何乙個物件對該值的修改都會影響到另乙個物件,這種情況就是淺拷貝。
深拷貝和淺拷貝主要是針對類中的指標和動態分配的空間來說的,因為對於指標只是簡單的值複製並不能分割開兩個物件的關聯,任何乙個物件對該指標的操作都會影響到另乙個物件。這時候就需要提供自定義的深拷貝的拷貝建構函式,消除這種影響。通常的原則是:
對於拷貝建構函式的實現要確保以下幾點:
C 拷貝建構函式和賦值運算子
本文主要介紹了拷貝建構函式和賦值運算子的區別,以及在什麼時候呼叫拷貝建構函式 什麼情況下呼叫賦值運算子。最後,簡單的分析了下深拷貝和淺拷貝的問題。在預設情況下 使用者沒有定義,但是也沒有顯式的刪除 編譯器會自動的隱式生成乙個拷貝建構函式和賦值運算子。但使用者可以使用delete來指定不生成拷貝建構函...
C 拷貝建構函式和賦值運算子
這篇文章主要介紹拷貝建構函式和賦值運算子的區別,以及在什麼時候呼叫拷貝建構函式,什麼情況下呼叫賦值運算子。在預設情況下 使用者沒有定義,但是也沒有顯示的刪除 編譯器會自動隱式生成乙個拷貝建構函式和賦值運算子,但使用者可以使用delete來指定不生成拷貝建構函式和賦值運算子,這樣的物件就不能通過值傳遞...
拷貝建構函式和賦值運算子
把引數傳遞給函式有三種方法,一種是值傳遞,一種是傳位址,還有一種是傳引用。前者與後兩者不同的地方在於 當使用值傳遞的時候,會在函式裡面生成傳遞引數的乙個副本,這個副本的內容是按位從原始引數那裡複製過來的,兩者的內容是相同的。當原始引數是乙個類的物件時,它也會產生乙個物件的副本,不過在這裡要注意。一般...