類和物件基礎 複製建構函式

2021-10-05 17:16:05 字數 2164 閱讀 6244

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...