構造和初始化的區別
兩者從意義上而言:
1)初始化:乙個變數或者乙個物件在產生的時候就賦予乙個值,屬於伴隨性質
2)賦值:在乙個變數或者乙個物件在產生之後的任意時刻賦予乙個值,屬於任意性質
建構函式:
1)函式的名字與類的名字相同
2)在建立乙個物件時,建構函式就自動執行,但是在宣告乙個類的指標物件時,建構函式不會被呼叫,當new乙個空間的時候,建構函式才會被呼叫
3)建構函式一般用來對資料成員的賦值,這也是它的一般性作用
4)建構函式沒有返回值
5)乙個類裡面也可以有多個建構函式,這些建構函式根據引數的不同,構成過載,根據引數的傳遞來選擇呼叫哪個建構函式
6)可以不用顯式的定義建構函式,這種情況下,編譯器會自動幫我們生成乙個空建構函式,什麼也不執行;如果我們顯式的宣告了乙個建構函式,那麼這個建構函式就會覆蓋預設的空建構函式
結論一:
建構函式其實就是做了對成員的賦值這件事,將因為初始化而產生的隨機值改變成我們預設的期待值。
如何分析基類,繼承類,子物件的構造順序呢?
因為有了前面的知識鋪墊,我們就可認定,繼承類的建構函式是最晚執行的。那麼關於子物件和基類的構造順序呢?
關於繼承中的作用域問題:
很對的時候,當我們在思量基類和子類的作用於到底是誰包含誰?我們會下意識的想到:在記憶體中基類資料總是作為子類的資料的一部分存在的,所以錯判定子類的作用於大於基類的作用域?
在程式編寫的過程中,大多數語言使用{}來分離作用域(python除外…), 而作用域存在的目的在於隔離識別符號,防止同名衝突。通常我們可以在內層作用於中訪問外層作用於中的已定義的識別符號,而不能反過來(涉及變數的生存期概念)。知道了這個,那我們推導一下:「在子類中可以訪問基類中的public識別符號,而不能逆訪問。」 ->
得出結論:基類的作用域大於子類的作用域。
然後再來解決先前遺留的問題:
因為有了前面的知識鋪墊,我們就可認定,繼承類的建構函式是最晚執行的。那麼關於子物件和基類的構造順序呢?
物件的構造通常是先構造外層作用域中的變數,而後構造內層。
int
main()
}return0;
}
子物件的作用域是在子類中,所以…, 先構造基類,然後構造子物件。
//ps. 對於作用域的分類和概念,很複雜很多,詳情請看《c++語法詳解》。
驗證:
#include
using
namespace std;
classb1~
b1()void
print()
private
:int b1;};
classb2~
b2()void
print()
private
:int b2;};
classb3~
b3()int
getb3()
private
:int b3;};
classa:
public b2,
public b1 ;~
a()void
print()
private
:int a;
b3 bb;};
intmain()
reference:
繼承類中的子物件和基類物件的初始
考察下面的程式 class point1 point1 point1 point1 point1 int i point1 point1 class point2 public point1 point2 point2 point2 point2 int i,int j,int k point2 p...
c 繼承類中的子物件和基類物件的初始化
先給結論 1 派生類中的基類子物件和子物件必須初始化,初始化在派生類的建構函式的初始化列表中,如果初始化列表中沒有進行初始化,則呼叫預設的建構函式進行初始化。2 派生類建構函式的呼叫順序 基類的建構函式 子物件類的建構函式 派生類的建構函式 例子class point1 point1 point1 ...
C 類繼承 建構函式時先構造基類
以下說明繼承類函式構造時,先構造基類 析構基類時,若沒加上virtual,只析構基類,不析構派生類 析構派生類時,同時會析構基類 1.基類析構函式有virtual include class base virtual base virtual void seta 0 class a public b...