C 建構函式和拷貝建構函式詳解

2021-06-18 17:19:43 字數 1779 閱讀 8751

建構函式、析構函式與賦值函式是每個類最基本的函式。它們太普通以致讓人容易麻痺大意,其實這些貌似簡單的函式就象沒有頂蓋的下水道那樣危險。

每個類只有乙個析構函式和乙個賦值函式,但可以有多個建構函式(包含乙個拷貝建構函式,其它的稱為普通建構函式)。

對於任意乙個類a,如果不想編寫上述函式,c++編譯器將自動為a 產生四個預設的函式,例如:

a(void); // 預設的無引數建構函式

a(const a &a); // 預設的拷貝建構函式

~a(void); // 預設的析構函式

a & operate =(const a &a); // 預設的賦值函式

這不禁讓人疑惑,既然能自動生成函式,為什麼還要程式設計師編寫?原因如下:

<1>如果使用「預設的無引數建構函式」和「預設的析構函式」,等於放棄了自主「初始化」和「清除」的機會,c++發明人stroustrup 的好心好意白費了。

<2>「預設的拷貝建構函式」和「預設的賦值函式」均採用「位拷貝」而非「值拷貝」的方式來實現,倘若類中含有指標變數,這兩個函式注定將出錯。

c++ 預設建構函式 :

1、每個類必須有乙個建構函式,否則沒法建立物件;

2、若 程式設計師沒有提供任何建構函式,則 c++提供乙個預設的建構函式,該預設建構函式是無參建構函式,它僅負責建立物件,不做任何初始化的工作;

3、只要 programer 定義了乙個建構函式(不管是無參還是有參構造),c++就不再提供預設的預設建構函式。即如果為類定義了乙個帶參的建構函式,還想要無參建構函式,就必須自己定義;

4、與變數定義類似,在用預設建構函式建立物件時,如果建立的是全域性物件或靜態物件,則物件的位模式全為 0,否則,物件值是隨機的。

c++預設拷貝建構函式:

1、預設的拷貝建構函式執行的順序與其他使用者定義的建構函式相同,執行先父類後子類的構造.

2、拷貝建構函式對類中每乙個資料成員執行成員拷貝(memberwise copy)的動作.

3、如果資料成員為某乙個類的例項,那麼呼叫此類的拷貝建構函式.

4、如果資料成員是乙個陣列,對陣列的每乙個執行按位拷貝.

5、如果資料成員是乙個數量,如int,double,那麼呼叫系統內建的賦值運算子對其進行賦值.

請看下面**:

#include 

#include 

using

namespacestd;  

classstudent  

student(intk)  

student(studentconst&m)  

voidp()  

~student()  

protected:  

inti;  

};  

intmain(intargc,char**argv)    

執行結果:

建構函式2  

9818  

拷貝建構函式  

-9818  

拷貝建構函式  

-9818  

拷貝建構函式  

-9818  

建構函式1  

9818  

析構函式  

析構函式  

析構函式  

析構函式  

c 建構函式和拷貝建構函式

c 中為什麼要使用建構函式?c 是從c演變過來的,c中存在的是結構體,例如 對點point struct point 但是對點的操作還要在外部使用函式來實現。c 中包括了成員屬性和成員方法,但是由於類的封裝性,不能像普通變數乙個對成員屬性就行初始化,所以使用建構函式。class point doub...

C 拷貝建構函式詳解

一.什麼是拷貝建構函式 首先對於普通型別的物件來說,它們之間的複製是很簡單的,例如 int a 100 int b a 而類物件與普通物件不同,類物件內部結構一般較為複雜,存在各種成員變數。下面看乙個類物件拷貝的簡單例子。include using namespace std class cexam...

C 拷貝建構函式詳解

一.什麼是拷貝建構函式 首先對於普通型別的物件來說,它們之間的複製是很簡單的,例如 int a 100 int b a 而類物件與普通物件不同,類物件內部結構一般較為複雜,存在各種成員變數。下面看乙個類物件拷貝的簡單例子。include using namespace std class cexam...