1:只有乙個引數,即對同類物件的引用。形如 x::x( x& )或x::x(const x &), 二者選一後者能以常量物件作為引數:
2:如果沒有定義複製建構函式,那麼編譯器生成預設複製建構函式。預設的複製建構函式完成複製功能。例:
如果沒有定義複製建構函式:
class
complex
; complex c1;
//呼叫預設無參建構函式
complex c2
(c1)
;//呼叫預設的複製建構函式,將 c2 初始化成和c1一樣
如果定義的自己的複製建構函式,則預設的複製建構函式不存在。
class
complex
complex
(const complex & c )};
complex c1;
complex c2
(c1)
;
注:不允許有形如 x::x( x )的建構函式
class
csample
//錯,不允許這樣的建構函式
};
(一):當用乙個物件去初始化同類的另乙個物件時。 例:
complex c2
(c1)
;complex c2 = c1;
//初始化語句,非賦值語句
(二):如果某函式有乙個引數是類 a 的物件,那麼該函式被呼叫時,類a的複製建構函式將被呼叫。
例:
classa;
a( a & a)};
void
func
(a a1)
intmain()
程式輸出結果為:我是複製建構函式
(三): 如果函式的返回值是類a的物件時,則函式返回時, a的複製建構函式被呼叫
例:
classa;
a(const a & a)};
a func()
intmain()
程式輸出結果為::
我是複製建構函式
4注:物件間賦值並不導致複製建構函式被呼叫
例:
a a1,a2; a1 = a2;
//假如a為乙個類的名字,那麼這裡不會呼叫複製建構函式
void
fun(cmyclass obj_
)
這樣的函式,呼叫時生成形參會引發複製構造函式呼叫,開銷比較大。 所以可以考慮使用 cmyclass & 引用型別作為引數。例:如果希望確保實參的值在函式中不應被改變,那麼可以加上const 關鍵字:
void
fun(
const cmyclass & obj)
classaa
(const a & a )~a
()//這是析構函式};
a f(
)int
main()
dev c++輸出結果:
1 constructor called
10 constructor called
10 destructor called
10 destructor called
visual studio輸出結果:1 constructor called
10 constructor called
10 destructor called
copy called
12 destructor called
12 destructor called
總結:說明dev出於優化目的並未生成返回值臨時物件。vs無此問題
類和物件 複製建構函式
形如x x x 或x x const x 二選一,後者能以常量物件作為引數 class complex complex c1 呼叫預設無參建構函式 complex c2 c1 呼叫預設的複製建構函式,將 c2 初始化成和c1一樣class complex complex const complex ...
類與物件 組合類的建構函式和複製建構函式
初始化列表是用於構造函式引數的初始化,與其他函式不同,建構函式除了有名字,引數列表和函式體之外,還可以有初始化列表,初始化列表以冒號開頭,後跟一系列以逗號分隔的初始化字段。如 class myclock 建構函式的實現和初始化設定 myclock myclock int hh,int mm,int ...
類與物件 複製建構函式
二進位制複製不複製指向的記憶體單元,這導致兩個 mystring 物件指向同乙個記憶體單元。函式 usemystring 返回時,變數 str 不再在作用域內,因此被銷毀。為此,將呼叫 mystring 類的析構函式,而該析構函式使用 delete釋放分配給 buffer 的記憶體,這將導致 mai...