C 之建構函式與初始化列表

2021-06-21 21:33:27 字數 1462 閱讀 4948

函式名與類名相同函式沒有返回值型別(void 也沒有)引數隨意的函式叫建構函式

class  類名

};(1)隱式構造

student s("wangfei",35);

(2)顯式構造

student s = student("wangfei",35);

可以在堆區開闢:

student* ps = new student("wangfei",35);

注意:(1)當乙個物件被構造時會自動呼叫建構函式,建構函式一般用於初始化物件中的成員變數

(2)如果沒有乙個為類中提供任何建構函式,系統就會提供乙個無慘建構函式(叫預設建構函式,也叫預設建構函式);如果為該類提供了至少乙個建構函式,無論是否有引數,系統都不再提供任何形式的建構函式 (見04class.cpp)

擴充套件:無參建構函式不是指建構函式中必須沒有引數而是指可以用無參的形式去呼叫(也就是有預設值)

class 類名

};成員變數的初始化順序和初始化列表中的順序無關,而是取決於成員變數的宣告順序

筆試題:

class  dumy

};問題: 先給m_len 初始化,此時m_str還沒有初始化,所以m_len得到的結果是無效值

解決辦法:

dumy(string str): m_str(str),m_len(str.length()){}

複習:c語言中沒有明顯的區分:

int i = 10;//宣告、定義、初始化

在c++中:

宣告:類定義時的成員變數(不分配記憶體)

定義:當使用類建立物件時,物件中對應的成員變數才會被定義,才會分配記憶體

初始化:在建立物件時,系統會自動呼叫建構函式進行初始化,如果建構函式中指定了初始化方式,那麼採用指定的初始化方式進行初始化,如果沒有指定初始化方式,系統採用預設的初始化方式(對於基本資料型別不做初始化,對於類型別呼叫預設的建構函式進行初始化);(見**03init.cpp)

注意:(1)類中包含常量和引用型的成員變數時,必須通過建構函式和初始化列表的方式進行顯式的初始化(見**04inti.cpp)

(2)在子類中顯式地構造其基類部分(以後講到)

(3)盡可能採用初始化列表的方式進行成員變數的初始化

在目標型別中定義建構函式的格式

目標類::目標類(const 源型別& 變數名){}

可以實現從源型別 到目標型別的隱式型別轉換

如:point3d::point3d(const point2d& pt):m_x(pt.m_x),m_y(pt.m_y),m_z(200){}

可以使用explicit 關鍵字修飾建構函式,表示該建構函式只能用於顯示型別轉換,從而防止潛在的錯誤;

C 建構函式與初始化列表

c 引入建構函式的目的在於對變數的初始化做出強制,因為人們發現,程式的錯誤,很大程度上來說,都是由變數沒有初始化造成的。因此,一種很好的程式設計習慣就是,在定義變數的時候直接初始化。而在c 中,在變數定義時,系統會自動呼叫變數的建構函式對變數進行初始化。只要將相應的初始化 放在建構函式中,就能夠保證...

C 建構函式 ,初始化列表

c 中的類的建構函式 1.如果類中沒有定義建構函式,編譯器將生成乙個預設建構函式,這個預設建構函式會呼叫類中所有成員的預設建構函式,但不會對如int,double的基本資料型別做初始化 2.類中可以定義多個建構函式,但每個建構函式應該有不同的引數實現 3.預設建構函式必須定義的情況,當需要定義乙個物...

C 建構函式初始化列表

從概念上講,可以認為建構函式分兩個階段進行 1.初始化階段 2.普通的計算階段。計算階段由建構函式函式體中的所有語句組成 不管成員是否在建構函式初始化列表中顯示初始化,類型別的資料成員總是在初始化階段初始化。初始化發生在計算階段的開始之前。建議 使用建構函式初始化列表 注 必須對任何const或引用...