建構函式 ,是一種特殊的方法。主要用來在建立物件時初始化物件, 即為物件成員變數賦初始值。建構函式沒有返回值,可以有引數。
預設建構函式,如果不寫的話也是可以的,編譯器在執行時候發現類中沒寫建構函式,會自動給類中加上乙個無參的建構函式,即預設建構函式。
但如果你自己編寫了建構函式的過載,編譯器識別到了存在建構函式,那麼空參的建構函式就不會自動給你加上去, 所以建議手動寫上預設建構函式。
#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關鍵字 時,系統回自動呼叫給類的建構函式初始化新...