C 建構函式(二)

2022-03-02 07:43:18 字數 1879 閱讀 4203

本篇是介紹c++的建構函式的第二篇(共二篇),屬於讀書筆記,對c++進行乙個系統的複習。

複製建構函式是建構函式的一種,也被稱為拷貝建構函式,他只有乙個引數,引數型別是本類的引用。預設建構函式(即無參建構函式)不一定存在,但是複製建構函式總會存在。因為只要沒有自己寫的複製建構函式,就會自動生成乙個複製建構函式,它只是實現了對應成員之間的一一對應的複製。大多數時候這樣乙個自動生成的複製建構函式是夠用的,但是當涉及到「深拷貝」的需求時還是要自己設計複製建構函式。

建構函式不能以本類的物件作為唯一引數,以免和複製建構函式相混淆。舉例子來說就是, cnum(cnum n){}; 這樣的建構函式是不允許的。

為什麼c++要有這樣的機制來保證複製建構函式一定存在呢,因為在很多種情況下都會需要這樣的建構函式。

對基本資料型別有這樣的用法:

1

int a = 2;2

int b = a;

第二個語句中使用乙個int變數初始化了另乙個int變數。物件也可以有類似的初始化方法,用乙個物件去初始化另乙個同類物件。

1 cnum n1 = 1

;2 cnum n2 = n1;        //

呼叫複製建構函式

注意,第二個語句是一條初始化語句,呼叫了複製建構函式。如果分開寫成cnum n2; n2 = n1;就不會呼叫複製建構函式而是呼叫無參建構函式,然後呼叫對=運算子的過載函式。

物件作為引數時的傳參方法是傳值,所以進入這樣的函式時就需要在棧幀中構造乙個形參物件。作為形參的物件是使用複製建構函式初始化的,而且呼叫複製建構函式時使用的引數,就是呼叫函式時所給的實參。這一種用法和第三種用法正是必須有複製建構函式的原因。

總之傳遞的引數是物件時就一定會呼叫複製建構函式。複製建構函式有可能並不是「忠實地」一一對應的複製,因此「形參值總等於實參值」這句話就不一定對了,是否完全相等取決於複製建構函式是怎樣編寫的。

要說明的是,把物件作為函式的形參顯然是效率較低的做法,建議使用物件的引用作為形參。如果不希望實參被修改,可以在形參前面加const修飾。

函式返回時到底發生了什麼呢,或者說return語句到底發生了什麼呢?需要被返回的值是儲存在被呼叫函式(callee)的棧幀(stack frame)中的,但函式返回後callee的棧幀已經不再存在,返回值應該在返回之前被拷貝到乙個安全的位置才行。如果是基本型別的返回值,直接的做法是把返回值儲存到乙個暫存器中,而對物件顯然不能這樣做(如果不了解暫存器是什麼可以忽略這一句),但總之需要把需要返回的物件返回到乙個合適的位置,這就要用到複製建構函式。

作為函式返回值的物件,是用複製建構函式初始化的,而呼叫複製建構函式時的實參就是return語句所返回的物件。

除複製建構函式外,只有乙個引數的建構函式一般都可以稱為型別轉換建構函式,它們可以起到型別自動轉換的作用。還是cnum的例子:

1

class

cnum

7 cnum(int a)

8 cnum(int a, int b)

9 }

第二個建構函式cnum(int a)就是乙個型別轉換建構函式。

1 cnum n1 = 2;        //

呼叫了cnum(int a)

但是實際上如果有這樣的語句,結果類似可是過程卻完全不一樣。

1

cnum n1;

2 n1 = 2;

的二條語句也是合法的,而且實際上還呼叫了cnum(int a),這要說一下 n1 = 2; 這條語句是怎麼實現的,過程就是先用2作為實參呼叫cnum(int a);生成乙個無名的臨時物件,然後把臨時物件按成員對應複製給n1。這樣做的效率顯然低於 cnum n1 = 2; 這一條語句。

總之其他型別到物件的轉換並不是那麼的直接,臨時物件的建立需要呼叫型別轉換建構函式,之後再對應賦值。

c 建構函式 拷貝建構函式 c 複習 二

c param mark 資料型別 string代替char void tv power 有且只有一次的初始化,根據條件初始化 建構函式例項化時被自動呼叫 建構函式與類名同名 建構函式沒有返回值 建構函式可以進行過載 例項化物件時建構函式有且只用到一次 使用者沒有定義建構函式時,編譯器自動生成建構函...

c 例題 建構函式(二)

題目來自 專案3 編寫基於物件的程式,求5個長方柱的體積和表面積。長方柱類bulk的資料成員包括長 length 寬 width 高 heigth 等。另外 1 需要定義長方柱類,5個長方柱採用乙個物件陣列表示 2 定義相應的建構函式以支援如下main 函式中的初始化,其中前3個直接給出引數初始化 ...

C 類(拷貝建構函式)(二)

拷貝建構函式是一種特殊的建構函式,它在建立物件時,是使用同一類中之前建立的物件來初始化新建立的物件。拷貝建構函式通常用於 如果在類中沒有定義拷貝建構函式,編譯器會自行定義乙個。如果類帶有指標變數,並有動態記憶體分配,則它必須有乙個拷貝建構函式。拷貝建構函式的最常見形式如下 classname con...