假期 2020.02
.02
學習總結資源**於中國大學mooc,c語言中文網
類的建構函式是類的一種特殊的成員函式,它會在每次建立類的新物件時執行。
系統預設建構函式:預設的建構函式沒有任何引數
class complex
;//編譯器自動生成預設建構函式
complex c1;
//預設建構函式被呼叫
complex * pc = new complex;
//預設建構函式被呼叫
建構函式的名稱與類的名稱是完全相同的,並且不會返回任何型別,也不會返回 void。如果需要,建構函式也可以帶有引數且建構函式可用於為某些成員變數設定初始值。
#include
using namespace std;
class complex
complex
(double r,
double i =2)
;//有參
complex
(complex r, complex i);}
;//成員函式定義
complex:
:complex
(double a,
double b)
complex:
:complex
(complex r, complex i)
intmain()
執行效果
注意:
c++ 初始化類成員時,是按照宣告的順序初始化的,而不是按照出現在初始化列表中的順序。
class abc
;void abc:
:show()
abc:
:abc
(int x,
int y)
:m_y
(y),
m_x(m_y)
;int
main()
你可能以為上面的**將會首先做 m_y=i,然後做 m_x=m_y,最後它們有相同的值。但是編譯器先初始化 m_x,然後是 m_y,,因為它們是按這樣的順序宣告的。結果是 m_x 將有乙個不可**的值。
執行效果
可以有多個建構函式,引數個數或型別不同
class complex
complex
(double r,
double i =2)
;//有參
complex
(complex r, complex i);}
;//成員函式定義
complex:
:complex
(double a,
double b)
complex:
:complex
(complex r, complex i)
建構函式最好是public的,private建構函式 不能直接用來初始化物件
class csample
csample
(int n)};
intmain()
; cout <<
"step2"
<< endl;
csample arry3[2]
=;cout <<
"step3"
<< endl;
csample* arry4 = new csample[2]
; delete[
]arry4;
return0;
}
class test
test
(int n,
int m)
test()
};intmain()
; test arry2[3]
=;test* arry3[3]
=;return
0;
陣列類的不同的初始化方式(以上為)
其中test* arry3[3] = ;
只生成了兩個類物件,第三個為空指標,無意義,即使加入null
也一樣。如a * arr[4] = ;
只有乙個引數,即對同類的象的引用,如
complex:
:complex
(complex &) 或
complex:
:complex
(const complex &
)
兩者選一,但加上 const 是更好的做法,這樣複製建構函式才能接受常量物件作為引數,即才能以常量物件作為引數去初始化別的物件。但在實際運用中不僅僅可以實現複製功能,還可以實現其他功能。
如果沒有定義複製建構函式,那麼編譯器會預設生成複製建構函式
class complex
;//呼叫預設無參建構函式
complex c1;
//呼叫預設的複製建構函式,將 c2 初始化成和c1一樣
complex c2
(c1)
;
可執行**
#include
using namespace std;
class complex
void
show()
};intmain()
執行結果
2. 如果定義的自己的複製建構函式, 則將編譯器不會構造預設的複製建構函式
#include
using namespace std;
class complex
//預設建構函式,不寫會出現錯誤,因為預設建構函式只出現在無建構函式類中
complex
(const complex& c)
;//構造複製函式};
complex:
:complex
(const complex& c)
intmain()
執行效果
3. 不允許有形如 complex::complex( complex)的建構函式。
複製建構函式常用於:
complex c2
(c1)
; complex c2 = c1;
//初始化語句,非賦值語句
class a ;a
( a & a)};
void
func
(a a1)
;int
main()
a func()
intmain()
注:1. 預設建構函式(即無參建構函式)不一定存在,但是複製建構函式總是會存在。
以物件作為函式的形參,在函式被呼叫時,生成的形參要用複製建構函式初始化,這會帶來時間上的開銷。如果用物件的引用而不是物件作為形參,就沒有這個問題了。但是以引用作為形參有一定的風險,因為這種情況下如果形參的值發生改變,實參的值也會跟著改變。解決辦法就是將形參宣告為物件的 const 引用。
2. 物件間賦值並不導致複製建構函式被呼叫。
C 建構函式介紹
每個類都分別定義了它的物件被初始化的方式,類通過乙個或幾個特殊的成員函式來控制其物件的初始化過程,這些函式叫做建構函式。從定義中,首先可以得知以下兩點 建構函式也是一種類的成員函式,但是其有特殊性。任務是初始化類物件的資料成員,所以無論何時只要類物件被建立,就會執行建構函式。建構函式沒有返回型別 建...
C 拷貝建構函式介紹
拷貝構造函式呼叫的三種情況 1.使用乙個已經建立完畢的物件來初始化乙個新物件 2.值傳遞的方式給函式引數傳值 3.以值方式返回區域性物件 include using namespace std class person person int age person const person p per...
c 類的建構函式及子類的建構函式
類在建立的時候需要呼叫建構函式,假如對系統沒有任何說明,則會呼叫系統預設的建構函式,在需要自行寫建構函式的時候往往是一下幾種情況 1.建構函式中不帶引數 includeusing namespace std class student student student void int student...