拷貝建構函式細說

2021-10-24 14:46:30 字數 1932 閱讀 5860

一:拷貝建構函式

//普通的拷貝行為(比較簡單)

int a=10;

int b=a;

二:拷貝建構函式的定義:

如果乙個類的建構函式的第乙個引數是所屬類的引用,如果還有其它額外的引數,那麼這些額外的引數必須又預設值,則這樣的建構函式叫拷貝建構函式。

函式預設引數必須放在函式宣告中,除非該函式沒有函式宣告。

例如:class

apublic

:int a1;};

類外定義時,不需要指定形參預設值。

a::a(

const a &temp,

int a)

三:

拷貝建構函式的作用:會在一定的時機被系統呼叫。

classtt

(const t &temp)

//t(const t &temp,int a=10)

public

:int a;

int b;};

例如:t t1;

//除了這個

t t2 = t1;

t t3 =

;t t4 (t1)

;t t5

;

拷貝建構函式的使用建議:

拷貝建構函式的第乙個引數一般都是帶著const

拷貝建構函式一般不要宣告成explicit

(系統呼叫拷貝建構函式時一般都會進行隱式型別轉換)、

例如:a

(const a &temp)

;//不建議這樣

explicitt(

const t &temp)

//t(const t &temp,int a=10)

t t1;

t t2 = t1;

//不可以

t t3 =

;//不可以

t t4 (t1)

;t t5

;

其它:

(1)預設情況下,類物件的拷貝是每個成員變數的逐個拷貝(內部實現機制比較複雜)。

(2)預設情況下,如果我們不定義拷貝建構函式,那麼編譯器會為我們定義乙個預設拷貝建構函式

這個預設建構函式會為正在建立的物件的每個成員進行逐個拷貝,例如,如果類成員時int型別,

那麼就進行值的拷貝,如果成員是乙個類物件,而這個類物件成員的拷貝由它自己是否有拷貝

建構函式決定,如果有,那當然就有拷貝建構函式進行拷貝控制了,如果沒有,拷貝動作就由

系統建立的合成預設建構函式決定

其它會呼叫拷貝建構函式的情況:

void

fun(a a)

a func()

呼叫fun函式和func函式時,會呼叫拷貝建構函式。

理解:func,因為return a時,返回的是乙個臨時物件,這個臨時物件是通過這個區域性物件a進行賦值的,所以這裡會呼叫拷貝建構函式。

完整測試**:

//#include

"pch.h"

#include

classaa

():a1

(2)public

:int a1;};

class

texplicitt(

const t &temp)

//t(const t &temp,int a=10)

public

:int a;

int b;

a obj;};

void

fun(a a)

a func()

intmain()

; t t4 (t1)

; t t5

; a obj;

fun(obj)

;return0;

}

拷貝建構函式,預設拷貝建構函式

拷貝建構函式,預設拷貝建構函式 1.c 的預設拷貝建構函式,從深度拷貝和淺拷貝說起 c 類的預設拷貝建構函式的弊端 c 類的中有兩個特殊的建構函式,1 無參建構函式,2 拷貝建構函式。它們的特殊之處在於 1 當類中沒有定義任何建構函式時,編譯器會預設提供乙個無參建構函式且其函式體為空 2 當類中沒有...

建構函式 拷貝建構函式

建構函式可以分為三類 1 不帶引數的建構函式 在函式體中對資料成員賦初值,這種方式使該類的每乙個物件都得到同一組初值 2 帶引數的建構函式 如果使用者希望對不同的物件賦不同的初值,可以採用帶引數的建構函式。在呼叫不同物件的建構函式時從外面將不同的資料傳遞給建構函式,以實現初始化 3 複製建構函式 建...

建構函式 拷貝建構函式

person person 引用就是指標常量 所以person p person const p,引用所以一旦初始化指向某個位址,就不能在改變了。為什麼前面還要加const,因為拷貝建構函式的目的就是將乙個物件的所有屬性拷貝到另外乙個物件,這個物件的屬性不變,加上const 相當於 const pe...