1樓:白白小白
copy constructor
建立物件的時候,用同一類的物件對它進行初始化的時候會自動呼叫拷貝建構函式。Aa
;Ab=
a;或者傳參Ab
;f(b
);或者返回值是物件Af
()語法
public:A
(constA&
a);我們首先希望傳參的時候不會對原來的物件產生修改,所以使用了const型別
避免迴圈拷貝
什麼時候需要自定義拷貝建構函式?
比如下面一段
classs
string
~string()}
strings1(
"abcd"
);strings2=
s1;如果使用的是預設的建構函式,那麼s1和s2中的p同時指向了「abcd」的位址空間
當「abcd」發生改變的時候,s2的指標可能就會變成懸掛指標
因此,我們需要deep copy深拷貝。
有乙個神奇的地方
包含成員物件的類
我們呼叫拷貝建構函式
呼叫的是成員物件的拷貝建構函式
當我們呼叫自定義拷貝建構函式
我們呼叫的是成員物件的預設建構函式
比如下面這段
class
Avoid
inc()
};classBB
(constB&
b)void
inc()
}我們執行B b1,此時b1.z=b1.a.x=b1.a.y=0
b1.inc(),此時b1.a.x=b1.a.y=b1.z=1
B b2(b1),此時b2.z=1,b2.a.x=0,b2.a.y=0
原因是什麼?
我們首先要知道什麼叫做自定義?
程式設計師如果不去做一件事情,編譯器有乙個預設的規則,並且它會呼叫這個規則。
但是程式設計師接管這件事情,編譯器便什麼也不做。因為如果這樣,程式設計師要記住更多的規則。
於是編譯器便把所有任務放手給程式設計師了。
因此,B呼叫它的拷貝建構函式的時候,只會執行一條z=b.z語句。
C++是乙個龐然大物。但是它給予了程式設計師操控這門語言的能力。是你使用這門語言程式設計,而不是依賴這門語言程式設計。
如果想要簡單一點的,不妨去學學python。
2樓:nnnn123456789
物件作為引數傳遞的時候,這是拷貝構造函式呼叫的地方,而且無法避免。
對於簡單變數,int f(int x)這種定義,再f(2),呼叫函式的時候,先建立x, 再把2賦值給x, 完美。
可是對於乙個物件,"先建立,再賦值"這個邏輯行不通。因為沒法建立這個物件。
這個地方只能通過拷貝建構函式。
3樓:博麗靈夢
個人理解乙個是為了方便就像struct把很多引數放在一起一樣
另乙個就是為了封裝有時候你並不想讓你的client知道這個class有哪些成員
4樓:嗯嗯嗯嗯嗯
以乙個物件構造乙個另乙個物件的時候,就如果沒有拷貝建構函式的話,那麼應該怎麼實現?
可能會想到直接 bitwise copy,但是如果是以乙個繼承類初始化基類或者基類初始化繼承類,特別是帶有virtual base class或者virtual function的時候,單純的 bitwise copy 是不行的
這種情景還是挺常見的,所以複製構造還是有存在的意義的
5樓:樓主別編故事裝逼了
樓主意思是,為什麼要特意加乙個「拷貝建構函式」的概念他就是普通建構函式,只不過引數就是自身的常引用而已。
編譯器不需要給他產生預設實現,需要的時候全部由程式設計師控制。
我覺得也沒問題,說不定更好,能簡化c++的概念
6樓:右手特別巨
情景一:建構函式構造乙個物件。
情景二:構造乙個和現有物件一模一樣的新物件, 這種情況並不少見。假如沒有拷貝建構函式,該如何實現?
1.利用建構函式實現, 意味著原物件的所有修改過的成員變數都必須以引數形式傳遞到新的物件構造。那我們需要額外宣告乙個新的帶有所有成員變數作為引數的建構函式(現有的不一定包含所有), 並且所有的成員變數都提供乙個get函式,這樣才能從原物件獲取成員變數的值。
以上這麼麻煩, 實際上就是把整個物件傳過去,並且允許自由訪問私有成員。沒有比建構函式這個還要清晰,明確的表達了!
2.編譯器自動拷貝所有成員變數,允許通過另外乙個物件來構造乙個新的物件, 實際上預設就支援。但是我們會遇到一些情況, 例如乙個指向某種資源的指標,編譯器缺省會幫我們拷貝這個指標,而非指標指向的資源,並非我們預想的那樣。
於是某些情況下,我們迫切地需要允許我們自己定義如何拷貝物件裡的成員變數。沒有比建構函式這個還要清晰,明確的表達了!
建構函式以及拷貝建構函式面向的是不同的兩種場景,需求。它們有各自的意義,解決不同的實際問題。
7樓:假裝很酷
而拷貝構造是兩個物件之間的拷貝賦值,假設你有個型別A,有如下語句:
A a;
A a1 = a;
上面的第二條語句就是用到了拷貝建構函式,可以這麼理解,拷貝構造的應用場景就是,已經存在了乙個物件,然後把這個物件賦值給另外的同型別物件。
C 的建構函式與析構函式?
關於C 的問題,你的心中要有兩個概念,乙個是記憶體的分配,二是記憶體的初始化。C 的建構函式有兩個作用 第一,你必須要有乙個建構函式,compiler才會去給你分配記憶體。第二,分配了記憶體之後,再用建構函式去初始化記憶體。函式體為空,因為類中的每乙個成員都有預設建構函式和析構函式 否則是無法編譯的...
關於c 建構函式的問題?
Acjx A pnt1 newA A pnt2 new A 對於C 03標準來說,new A 一定是進行值初始化 value initialize 分為3種情況,如下 1.如果A是標量型別 例如 bool,int,char,double,指標 的話,A進行的是zero initialize,也就是用...
c 類的建構函式初始化問題??
Right If you don t specify any constructors,the compiler will write one for you that doesn t take any arguments.This compiler generated default constr...