在我們學習c++的過程中,我們難免會遇到類,在類中有6個預設的函式,它們分別為:建構函式、拷貝建構函式、析構函式、賦值操作符過載、取位址操作符過載和const修飾的取位址操作符過載,那麼我今天直介紹其中的建構函式。
1、什麼是建構函式?
建構函式是乙個特殊的成員函式,名字與類名相同,建立類型別物件時,由編譯器自動呼叫,在物件的生命週期內只呼叫一次,保證每個資料成員都有乙個合適的初始值。
2、建構函式的**表示:
class cdate
//帶引數的建構函式
cdate(const
int year, const
int month, const
int day)
private:
int _iyear;
int _imonth;
int _iday;
};
3、建構函式特性:
(1)、函式名與類名相同。
(2)、沒有返回值。
(3)、有初始化列表(可以不用)。
(4)、新物件被建立,由編譯器自動呼叫,且在物件的生命期內僅呼叫次。
(5)、建構函式可以過載,實參決定了呼叫哪個建構函式。
(6)、如果沒有顯式定義時,編譯器會提供乙個預設的建構函式。
(7)、無參建構函式和帶有預設值得建構函式都認為是預設建構函式,並且預設建構函式只能有乙個。
(8)、建構函式不能用const來修飾。
4、建構函式的作用:
初始化列表:以乙個冒號開始,接著是乙個以逗號分隔的資料成員列表,每個資料成員後面跟乙個放在圓括號中的初始化式。
cdate(int
year,int
month,int
day)
:_iyear(year)
,_imonth(month)
,_iday(day)
1、每個成員在初始化列表中只能出現一次。
2、初始化列表僅用於初始化類的資料成員,並不指定這些資料成員的初始化順序,資料成員在類中定義順序就是在引數列表中的初始化順序。
3、盡量避免使用成員初始化成員,成員的初始化順序最好和成員的定義順序保持一致。
類中包含以下成員必須要放在初始化列表中初始化:
1、引用資料成員
2、const資料成員
3、類型別成員(有建構函式,但不是預設的建構函式)
cdate(int year,int month,int day,int a,int b)
:_iyear(year)
,_imonth(month)
,_iday(day)
,_a(a)//引用變數初始化
, _b(b)//const修飾的變數初始化
private:
int _iyear;
int _imonth;
int _iday;
int &_a;//引用變數定義
const
int _b;//const修飾的變數
類如果沒有顯式定義建構函式時,編譯器會合成乙個預設的建構函式,該建構函式中什麼工作都不做。只要顯式定義了,即使該建構函式什麼也不做,編譯器也不會為該類合成預設的建構函式。編譯器生成的預設建構函式使用與成員變數初始化相同的規則來初始化成員,具有類型別的成員通過執行各自的預設建構函式來進行初始化。內建和復合型別的成員如指標、陣列,只對定義在全域性作用域中的物件初始化,當物件定義在區域性作用域時,內建和符合型別的成員不進行初始化。在某些情況下,預設建構函式是由編譯器隱式使用的。 C 中構造函式呼叫建構函式
include include using namespace std struct cls cls int main 列印結果是不定的,不一定為0 奇怪的地方在於建構函式中呼叫了自己的另乙個建構函式 我們知道,當定義乙個物件時,會按順序做2件事情 1 分配好記憶體 非靜態資料成員是未初始化的 2 ...
C 中構造函式呼叫建構函式
include stdlib.h include iostream using namespace std struct clscls int main 列印結果是不定的,不一定為0 奇怪的地方在於建構函式中呼叫了自己的另乙個建構函式 我們知道,當定義乙個物件時,會按順序做2件事情 1 分配好記憶體...
c 中構造函式呼叫建構函式
c 中建構函式完成的工作分兩步 1 分配空間 2 初始化空間 構造函式呼叫建構函式。class a a int a private int a 這樣會導致,a 中先分配了空間,然後呼叫a 0 又建立了乙個臨時物件,然後初始化為0,而原物件則沒有初始化。這種問題在類中有指標需要分配空間時會導致災難。從...