很多的人對中建構函式寢初始化很多的困惑,對冒號後初始化不是太明白,總搞不清楚它們之間的區別,我想把我對這個問題的理解和看法和大家討論討論。
在程式中定義變數並初始化的機制中,有兩種形式,乙個是我們傳統的初始化的形式,即賦值運算子賦值,還有一種是括號賦值,如:
int a=10;
char b='r';//賦值運算子賦值
int a(10);/
char b('r');//括號賦值
以上定義並初始化的形式是正確的,可以通過編譯,但括號賦值只能在變數定義並初始化中,不能用在變數定義後再賦值,這是和賦值運算子賦值的不同之處,如:
(1)
int a; //先定義乙個變數
......
a=10; //根據需要賦值
現在我們來看建構函式中冒號初始化和函式初始化的問題,類建構函式的作用是建立乙個類的物件時,呼叫它來構造這個類物件的資料成員,一要給出此資料成員分配記憶體空間,二是要給函式資料成員初始化,構造資料成員是按資料成員在類中宣告的順序進行構造。
冒號初始化與函式體初始化的區別在於:
冒號初始化是給資料成員分配記憶體空間時就進行初始化,就是說分配乙個資料成員只要冒號後有此資料成員的賦值表示式(此表示式必須是括號賦值表示式),那麼分配了記憶體空間後在進入函式體之前給資料成員賦值,就是說初始化這個資料成員此時函式體還未執行。
對於在函式中初始化,是在所有的資料成員被分配記憶體空間後才進行的。
這樣是有好處的,有的資料成員需要在建構函式調入之後函式體執行之前就進行初始化如引用資料成員,常量資料成員和物件資料成員,看下面的一段程式:
class student
在student類中有兩個資料成員,乙個是常量資料成員,乙個是引用資料成員,並且在建構函式中初始化了這兩個資料成員,但是這並不能通過編譯,因為常量初始化時必須賦值,它的值是不能再改變的,與常量一樣引用初始化也需要賦值,定義了引用後,它就和引用的目標維繫在了一起,也是不能再被賦值的。所以c
++":"後初始化的機制,使引用和常量資料成員變為可能的,student類的建構函式應為:
student ::student(int i,int j):a(i),b(j){}
在下面的程式:
class teach
teach ::teach(char*p,int a)
class student
; student::student(char *p)
在上面的程式中通不過編譯,編譯系統會告訴你teacher這個類物件缺預設建構函式,因為在teach 類中沒有定義預設的建構函式。那麼帶引數的建構函式怎麼進行構造呢?通過我們前面提到的冒號賦值。那它的建構函式應該是:
student::student(char *p,char *pl,int ag):teacher(pl,ag)
就是說在沒有預設建構函式的時候,如果乙個類物件是另乙個類的資料成員,那麼初始化這個資料成員,就應該放到冒號後面。這樣可以帶引數。在類的定義中,如:
網管bitscn_com
protected;
char name[30];
teach teacher
類物件是不能帶引數的,因為它只是宣告。
所以在c++中就增加了這種機制,這是物件導向程式設計所必須的。
C語言博大精深
因為計算機的運算模式是以二進位制為基礎,所以十進位制運算在計算時會被轉換成二進位制再進行運算,而轉換過程就會導致執行速度降 低。所以運用位運算可以提高 執行的效率。位運算說穿了,就是直接對整數在記憶體中的二進位制位進行操作。注意,位運算只針對於整數進行操作。二 位運算的使用規則 位運算的使用方法可以...
總結 C 真是博大精深(一)
c 的輸入 輸出和非物件導向的一些特性 最終解釋權歸原文作者所有,侵權必究 1 c 語言是c語言的超集,c語言中的表示式 語句 函式等在c 中仍然可以使用,c 語言是物件導向的語言,但是也包含一些非物件導向的特性。2 include是編譯預處理命令,用於指示編譯器在進行程式預處理時,將檔案iostr...
總結 C 真是博大精深(三)
派生類與繼承 最終解釋權歸原文作者所有,侵權必究 1 繼承是物件導向程式設計的重要特徵之一,通過繼承,可以實現 重用。在c 中,繼承就是利用已有的類,通過派生的方式產生新的類。新類不但繼承了已有類的屬性和方法,而且可以增加新的屬性和方法。2 在c 中,可以在已有類的基礎上構建新類,這個新類繼承了已有...