C 中何時呼叫複製建構函式

2021-06-07 10:30:12 字數 1125 閱讀 5977

在c++中,只有單個形參,而且該型別是對本類型別的引用(常用const修飾),這樣的建構函式稱為複製建構函式。

複製建構函式既可以自己定義又可以像預設建構函式一樣被編譯器隱式呼叫。但大多數時候,特別是類中有指標成員的時候要實現深複製,避免淺複製時,就需要自己定義複製建構函式。

那麼我們定義的複製建構函式什麼時候呼叫呢,總結起來,有如下五種情況,下面分別舉例說明。

一、根據乙個同型別物件顯示或隱式初始化乙個物件。

例如:

string str1 = "123456";//copy-initialization

string str2(str1);//copy-initialization

string str3(10, '1');//direct-initialization

用「=」時,都是採用複製建構函式,具體過程是先用相應建構函式建立臨時物件,然後採用copy構造複製過去。

二、複製乙個物件將它作為實參傳給乙個函式。

例如:

class a;

a f(a a)

a作為非引用實參傳遞給函式f,形參a將被初始化為實參的乙個副本,這時呼叫copy構造。

三、從函式返回時複製乙個物件。

例如:

class a;

a f(a a)

跟上例一樣,但這次要說的是返回值,因為返回的是非引用,所以要將a複製乙份返回,所以此時也呼叫copy構造。

四、初始化順序容器中的元素。

我們知道,容器中元素的初始化都是複製初始化,所以不能複製的物件是不可以存到容器中的,例如io物件。

既然是複製,那麼將乙個類物件放入容器中的時候就會呼叫copy構造。

例如:

vectorstr_vec(5);

str_vec先用string預設構造建立乙個臨時值來初始化str_vec,然後用使用copy構造將臨時值複製到str_vec的每個元素。

五、根據元素初始化式列表初始化陣列元素。

例如:

string strs = ;
在以上陣列中,陣列元素將是用三個字串的副本。

以上五種情況便是複製建構函式的用武之地。

何時呼叫C 複製建構函式和拷貝建構函式

1.何時呼叫複製建構函式 複製建構函式用於將乙個物件複製到新建立的物件中。也就是說,它用於初始化過程中,而不是常規的賦值過程中。類的複製建構函式原型通常如下 class name const class name 它接受乙個指向類物件的常量引用作為引數。例如,string類的複製建構函式的原型如下 ...

何時呼叫拷貝建構函式

拷貝建構函式是一種特殊的建構函式 拷貝建構函式是由編譯器呼叫,用來完成一系列基於同一類的其他物件的構件及初始化。拷貝建構函式的一般形式 類名 類名 變數名 函式體 拷貝建構函式的名稱必須和類名一致,形參必須是唯一的 不可改變的本型別的乙個引用型別的變數。拷貝構造函式呼叫的三種情況 物件以值傳遞的方式...

何時呼叫建構函式和析構函式

建構函式的作用是保證每個物件的資料成員都有何時的初始值。析構函式的作用是 記憶體和資源,通常用於釋放在建構函式或物件生命期內獲取的資源。構造從類層次的最根處開始,在每一層中,首先呼叫基類的建構函式,然後呼叫成員物件的建構函式。析構則嚴格按照與構造相反的次序執行,該次序是唯一的,否則編譯器將無法自動執...