建構函式的那些事

2021-06-25 18:14:25 字數 1962 閱讀 1046

建構函式:是一種特殊的方法,主要用來在建立物件時初始化物件,即為物件成員變數賦初始值。

析構函式和建構函式相對應,它的功能是釋放物件的記憶體空間。為了便於分析和理解,部落格內容加入了析構函式,並且將初始化列表單獨拿出來分析。部落格結構:

詳細內容如下: 一

建構函式: 1

建構函式是幹什麼的?

當乙個類物件被建立時,編譯系統後需要為物件分配記憶體空間,

c++中這個工作是由建構函式來完成。需要注意的是,初始化不等於賦值,初始化即分配空間,賦值是向記憶體空間插入資料。 2

建構函式都有那些型別?

預設建構函式:即如果沒有顯示的寫出建構函式,系統將會自動生成乙個建構函式,這個建構函式沒有引數,函式體為空,它什麼都不做;

一般建構函式(或者叫做過載建構函式):乙個類建構函式可以有多個建構函式,引數的不同,就可以形成函式的過載,建立物件時根據引數來判斷具體呼叫哪個建構函式;

複製建構函式:當類物件本身的引用作為建構函式的引數時,建構函式會複製出乙個新的物件,已存在的物件的資料成員的值會被複製到新建立的物件中。

3 建構函式有那些特點?

建構函式的命名必須和類名完全相同;建構函式用於完成物件初始化,所以它沒有返回值,不能用任何資料型別來修飾它;建構函式不能被顯示呼叫(父類建構函式帶引數除外),只能在建立物件時由編譯器自動呼叫。如果乙個類只定義了私有的建構函式,將無法通過

new關鍵字建立其物件。建構函式不可以是虛函式。

二析構函式:

析構函式和建構函式向對應,它是為了釋放物件記憶體而存在的。它不能被顯式呼叫,只能在刪除物件時由編譯器呼叫;它沒有返回值,所以不能用任何(包括

void

)修飾;沒有引數(不能過載)。

三建構函式的初始化列表:

1 為什麼使用初始化列表?建構函式初始化類的成員有兩種方式,一是使用初始化列表,二是在建構函式體內進行賦值操作。這兩種方式有什麼區別?使用初始化列表,那麼建構函式在建立物件時分配記憶體空間,並且直接進行賦值;如果是在函式體內賦值,那麼首先要呼叫建構函式分配記憶體,然後呼叫函式體進行賦值操作,也就是賦值操作需要比初始化列表多乙個步驟,對於成員變數較少的類沒有區別,但是對於有大量的成員變數的類,建立物件就是一種災難。

2 初始化列表的一般格式:

class a

}

對於無缺省建構函式的繼承關係:

class person

private:

string _name;

string _***;

}class man :public person

private:

string _age;

}

3 那些物件初始化必須要使用初始化列表?

(1) const

常量const

常量不能被賦值,只能初始化,所以需要使用初始化列表。

class a

//正確

a(int b) //錯誤,常量不能賦值。

private:

const int _b;

}

注意,上述兩個建構函式不能共存。

(2) 

含有自定義資料型別(類)物件的初始化

class person

class man

private:

person _sa;

}

(3) 

引用型別,引用必須在定義的時候初始化,並且不能重新賦值,所以也要寫到初始化列表中。

class a

private:

int &_r;

}

建構函式內容繁瑣,很多細節需要反覆去驗證。

以上為個人理解,如有錯誤,敬請指正。

C 建構函式那些事

乙個類,在未定義任何建構函式的情況下,建立該類對應的物件實體時,編譯器會隱式的定義乙個預設的建構函式 合成的預設建構函式,其按照如下規則初始化類的資料成員 然而,合成的預設建構函式只適合簡單的類。對於乙個普通的類來說,必須定義它自己的預設建構函式,原因有三 第乙個原因是編譯器只有在發現類不包含任何建...

談談建構函式的那些事

看過 c efficient 都應該明白以下幾點 1.最好有自己的拷貝建構函式 1.1 在函式引數為物件時,那麼在函式呼叫時,會呼叫拷貝構造生成乙個臨時物件 1.2 在函式返回值為乙個物件時,也會呼叫拷貝建構函式 1.3 拷貝建構函式一定要傳引用,如果穿乙個值,就會調拷貝構造,在乙個函式裡面,自己呼...

chapter2 軟體構造的那些事

重點 軟體配置管理 git 以及 版本控制系統 1開發的過程 從無到有 從有到好 2scm vcs 軟體配置管理 核心 版本管理 基線 vcs 對scm進行管理 乙個例子就是git git的使用 git init 初始化git add加入staging area git commit m 注釋 提交...