建構函式和拷貝建構函式

2021-10-08 17:23:54 字數 2086 閱讀 3436

建構函式

簡單地說建構函式是類函式,函式名與類名完全相同,無返回值

建構函式屬於類的成員函式,除了具有一般成員函式的特點外,還具有自己的特點:

(1)是類的乙個特殊的成員函式,函式名與類名相同;

(2)訪問屬性應該是public;

(3)功能是初始化物件,在建構函式中一般不作初始化以外的事情;

(4)可以在類內定義,也可在類外定義;

(5)無函式返回型別,注意:什麼也不寫,也不可寫為void;

(6)程式執行時,當物件被建立後,該物件所屬的類的建構函式自動被呼叫,在該物件生存期中也只呼叫這一次;

(7)可以過載

簡而言之,建構函式就是用來初始化物件的。

【 成員變數的初始化】

1)對成員變數進行初始化有許多方式,乙個是在建構函式體中進行難過初始化。

物件a在構造的同事呼叫建構函式,建構函式通過接收引數將引數傳遞到函式體中,然後又分別賦給私有變數length和width,完成了對成員變數的初始化工作。

2)另外還有一種方式就是在建構函式的函式頭進行初始化。(注意這種,也經常用)

rectangle () :length(3),width(4){}

在建構函式的右邊有個冒號(:),然後是成員變數的名稱和一對小括號(),小括號中要是初始化的值或者表示式。如果對多個成員進行初始化,那麼要用逗號將他們隔開,最後一對大括號{},大括號中就是函式索要執行的功能。

circle(int x,int y, int r):center(x,y)

在呼叫circle函式 的時候,傳進了center函式裡面送出的x和y值。

拷貝建構函式

1. 預設拷貝建構函式

很多時候在我們都不知道拷貝建構函式的情況下,傳遞物件給函式引數或者函式返回物件都能很好的進行,這是因為編譯器會給我們自動產生乙個拷貝建構函式,這就是「預設拷貝建構函式」,這個建構函式很簡單,僅僅使用「老物件」的資料成員的值對「新物件」的資料成員一一進行賦值,它一般具有以下形式:

rect::rect(const rect& r)

#includeusing namespace std;

class rect

~rect()

static int getcount()

private:

int width;

int height;

static int count;

};int rect::count=0;

int main()

rect(const rect& r)

~rect()

static int getcount()

private:

int width;

int height;

static int count;

};int rect::count=0;

int main()

~rect()

private:

int width;

int height;

int *p;

};int main()

在這段**執行結束之前,會出現乙個執行錯誤。原因就在於在進行物件複製時,對於動態分配的內容沒有進行正確的操作。如下處理即可。

#include#includeusing namespace std;

class rect

rect(const rect& r)

~rect()

private:

int width;

int height;

int *p;

};int main()

3. 防止預設拷貝建構函式

既然預設的 拷貝建構函式會造成諸多問題,而自定義拷貝建構函式又比較麻煩,此時,我們可以有個技巧來避免,就是宣告乙個私有的拷貝建構函式即可。如下:

private: 

cexample(const cexample& c); //拷貝建構函式,只是宣告

關於拷貝建構函式的詳細解釋見:

建構函式 拷貝建構函式

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

建構函式 拷貝建構函式

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

拷貝建構函式和賦值建構函式

class cmystring 賦值建構函式 cmystring cmystring operator const cmystring str 新分配記憶體,將str的m pdata記憶體拷貝到m pdata中 m pdata new char strlen str.m pdata 1 strcpy...