C 建構函式

2021-10-17 10:51:12 字數 3204 閱讀 2997

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

預設建構函式,如果不寫的話也是可以的,編譯器在執行時候發現類中沒寫建構函式,會自動給類中加上乙個無參的建構函式,即預設建構函式。

但如果你自己編寫了建構函式的過載,編譯器識別到了存在建構函式,那麼空參的建構函式就不會自動給你加上去, 所以建議手動寫上預設建構函式。

#include

using namespace std;

class a

;// 空參構造 成員資料初始化a::

a()//建構函式過載 傳入引數 成員資料初始化a::

a(string a,

int age)

//通過public 呼叫private的資料

void a:

:get()

//通過public 更改private的資料

void a:

:set

(string a,

int age)

intmain()

#include

using namespace std;

class a;a:

:a(string a,

int age)

void a:

:get()

void a:

:set

(string a,

int age)

intmain()

特別注意,如果對於建構函式給予了預設值 那麼就不可以寫建構函式的過載

為什麼? 如下的**段,對於a test(「666」) 是會執行第乙個還是第二個呢?

兩者都滿足 存在了多種情況 編譯器不知道選擇哪個, 所以會報錯。

class a

;

這個很簡單,就是有兩個建構函式,其中委託建構函式把自己的初始化讓另乙個建構函式去執行罷了。

#include

using namespace std;

class clock

;//這種寫法叫做 初始化列表

clock:

:clock

(int h,

int m,

int s)

:hour

(h),

mintue

(m),

second

(s)///委託建構函式 將預設建構函式委託給了帶有引數的建構函式去執行

clock:

:clock()

:clock(0

,0,0

)void clock:

:get()

intmain()

複製建構函式,就是用乙個已有的物件,去初始化乙個該類的物件。

複製建構函式被呼叫,有以下三種情況。

①用乙個已有的物件,賦值給新建立的物件

其實就是把乙個已有的複製一下給新建立的物件

clock myclockone;

clock myclocktwo=myclockone;

②呼叫函式時候,形參為該類的物件,主函式中的物件作為實參傳入形參,形參把值拷貝下來後,就與實參斷了聯絡 ,這裡注意是值傳遞才會呼叫 ,引用傳遞不會。

因為值傳遞會呼叫複製建構函式,所以通常情況下,如果模擬較複雜,建議用引用傳遞, 減少時間開銷。

void

fun1

(clock c)

intmain()

③函式返回值為類的物件時,會呼叫複製建構函式

這裡為什麼會呼叫呢?

表面上是將函式fun2()中的test物件返回給了主函式中的myclockone,但是其實test是函式fun2()中的區域性變數,test離開了函式fun2就消亡了。

這時候編譯系統會在主函式建立乙個無名的臨時物件,這個臨時物件的生命週期僅僅在myclockone=fun2()這句話。呼叫函式fun2時,return test;這個語句,實際上是呼叫了複製建構函式,將test的值初始化給了臨時物件,然後fun2()消亡,test物件也消亡了,但是臨時物件存在於表示式myclockone=fun2()中,計算完這個表示式後,臨時物件就消失了。

clock fun2()

intmain()

#include

using namespace std;

int cnt;

class clock

;clock:

:clock

(int h,

int m,

int s)

:hour

(h),

mintue

(m),

second

(s)void clock:

:get()

//複製

clock:

:clock

(clock &c)

void

fun1

(clock c)

clock fun2()

intmain()

根據複製建構函式被呼叫的三種情況,上述**應該會輸出ok 1

ok 2

ok 3

但是並沒有輸出第三句話,其實這是因為編譯器優化的原因,用cmd命令列執行,關掉編譯器優化即可。

cmd執行c++的方法為 先跳轉到cpp檔案的資料夾

g++ 檔名.cpp -o 檔案名字

然後執行 檔名.exe即可

關掉編譯優化就是在編譯命令最後加上 -fno-elide-constructors即可

如上圖 第一次執行時沒關編譯器優化 第二次是關掉了編譯優化

C 建構函式 拷貝建構函式

建構函式 class base private int m var 建構函式無返回值型別,函式名和型別相同。拷貝建構函式傳遞引數為引用。1 class base2 7 拷貝建構函式 8 base base ref m var ref m var 9 11 private 12 intm var 13...

C 構造器(建構函式)

定義和作用 構造器是在構建類的 引用時 自動執行的方法。所以,每個類都必須至少要有乙個構造器。在訪問乙個類的時候,編譯器最先執行構造器中的 它與類同名,帶引數的構造器能夠獲取引數,但是與方法不同的是 構造器雖然也是一種 例項型別 即必須通過例項來進行呼叫,也可以稱之為引用型別 但是卻不能返回任何值 ...

C 建構函式

建構函式是一種特殊的成員函式,它主要用於為物件分配儲存空間,對資料成員進行初始化.1 建構函式的名字必須與類同名 2 建構函式沒有返回型別,它可以帶引數,也可以不帶引數 3 建構函式的主要作用是完成對類的初始化工作 4 在建立乙個類的新物件 使用new關鍵字 時,系統回自動呼叫給類的建構函式初始化新...