C 的建構函式們

2022-07-30 14:00:19 字數 2554 閱讀 9799

1.什麼是建構函式?

一種特殊的成員函式,建立乙個物件時,系統需要呼叫物件的建構函式進行初始化,類似於oc的init方法

2.建構函式的特點

函式名與類名一樣,書寫格式:類名(引數列表)

沒有返回值,加上void也不行

每個類都有乙個預設的公共的無參建構函式,但只要額外增加了乙個建構函式,系統將不提供預設的空建構函式

建構函式可以過載,也就是說,可以提供多個建構函式

3.建構函式的其他知識點

如果物件是乙個全域性變數,那麼它的構造函式呼叫會先於main函式

4.什麼是轉換建構函式

帶有乙個引數的建構函式

可以將其他型別的數值轉為物件

例如:person p(20);//前提是需要提供下面的建構函式

直接呼叫轉換建構函式:person(int age)

如果是一下**需要分情況討論

person p;

p = 30;

如果person類過載了=(int)運算,第二句**會直接用過載過的運算子進行運算

如果沒有過載,則::先隱式呼叫轉換建構函式:person(int age)產生乙個臨時的person物件,再將臨時物件賦值給p; //會呼叫兩次轉換建構函式

person *persons = new person[2];//persons指向陣列的第乙個元素

person *persons = new person[2];跟上面一條語句一樣,多了呼叫轉換建構函式的過程

第一種建立方法建立出來的物件陣列在棧裡面,不需要我們手動管理,第二\三種方發建立的物件在堆裡,需要手動釋放

而且釋放物件陣列的時候,應該用指向首元素的指標去釋放,跟釋放物件不一樣,還要加上方括號,例如:

delete persons;

6.拷貝建構函式

---拷貝建構函式的基本資訊

什麼是拷貝建構函式 :::只有乙個引數,且引數為該類物件引用的建構函式 可以使用乙個已存在的物件來初始化乙個同型別的新物件 每乙個類都有乙個預設的公共的拷貝建構函式

拷貝建構函式的格式::: 類名(const 類名& 引數名)

加上const後,就不能在函式內部直接修改引數的成員變數

-----------拷貝建構函式的呼叫以及為什麼引數是引用

person p; person p2(p);// 相當於 person p2 = p;

上面的第2行**就會呼叫person的拷貝建構函式 

因此,用乙個物件初始化另外乙個物件時,系統會自動呼叫拷貝建構函式

也說明了拷貝建構函式的形參不能是物件,只能是物件引用 因為呼叫拷貝建構函式時,需要傳入乙個實參物件來初始化形參物件,這時候又會呼叫拷貝建構函式,造成死迴圈

------------拷貝建構函式一般在什麼時候被呼叫

1...明顯地用乙個物件初始化另外乙個物件 person p; person p2(p); // 相當於 person p2 = p;

2...當函式的形參是物件:呼叫函式時,會建立乙個區域性的形參物件,並且用實參物件來初始化形參物件,這裡會呼叫拷貝建構函式 void setbook(book book);

3...當函式的返回值是物件:系統會利用返回的物件再建立初始化乙個新的臨時物件,這時也呼叫了拷貝建構函式 book getbook()

綜上所述:一般都使用 物件引用 來取代 物件 作為函式引數或返回值

c++初始化列表

person::person(int age, double height) : _age(age), _height(height)

後面的: _age(age), _height(height)就是建構函式的初始化列表

上面**的最終效果等價於下面的** person::person(int age, double height)

----------------------但是他們的區別是什麼?

建構函式的執行分為2個階段:

初始化階段(物件分配記憶體時就進行的初始化賦值操作)

普通計算階段(物件初始化完畢後才進行的操作)

下面**中成員變數的賦值是在「初始化階段」完成的,給物件分配記憶體時,成員變數預設就有值了

person::person(int age, double height) : _age(age), _height(height)

下面**中成員變數的賦值是在「普通計算階段」完成的,給物件分配好記憶體後,還需要執行2行**給成員變數賦值

person::person(int age, double height)

總上所述:推薦使用建構函式的初始化列表來初始化成員變數

---------還有就是如果person類的成員變數有book類,並且book類只提供了乙個引數的構造方法(覆蓋了系統提供的空建構函式)

此時如果建立person物件會報錯,因為初始化person之前或初始化其成員變數book,但是book沒有空建構函式,則會報錯

此時就需要用初始化列表來初始化book

person() : _book(15.0){};這樣book在分配記憶體的時候直接呼叫轉換建構函式建立book物件

-----------------初始化列表還常用與const和引用的初始化,因為如果類person裡面有

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 的建構函式

tags c 建構函式是用於建立物件的特殊成員函式,當建立物件時,系統自動呼叫建構函式建構函式的作用是 為物件分配空間 對資料成員賦初值 請求其他資源 沒有使用者定義的建構函式時,系統提供預設版本的建構函式 建構函式名與類名相同 類名 建構函式可以過載,建構函式可以有任意型別的引數,但沒有返回型別。...

C 的建構函式

1 定義 在基於物件的程式中,在定義乙個物件時,也需要作初始化的工作,即對資料成員賦初值。因為不能再類宣告中對資料成員初始化 類並不是乙個實體,而是乙個抽象型別,並不占用儲存空間,顯然無法容納資料 c 提供了建構函式來處理物件的初始化。建構函式是一種特殊的成員函式,與其他成員函式不同,不需要使用者來...