c++ 預設建構函式
1、每個類必須有乙個建構函式,否則沒法建立物件;
2、若programer沒有提供任何建構函式,則c++提供乙個預設的建構函式,該預設建構函式是無參建構函式,它僅負責建立物件,不做任何初始化的工作;
3、只要programer定義了乙個建構函式(不管是無參還是有參構造),c++就不再提供預設的預設建構函式。即如果為類定義了乙個帶參的建構函式,還想要無參建構函式,就必須自己定義;
4、與變數定義類似,在用預設建構函式建立物件時,如果建立的是全域性物件或靜態物件,則物件的位模式全為0,否則,物件值是隨機的。
注:2所述,c++在某些情況下會提供預設建構函式,但在某些情況下並不會自動呼叫。
實事上,當使用者沒有提供自定義的建構函式的時候,宣告該類的物件,以及定義包含該物件的陣列,都不會呼叫預設建構函式;但定義包含該物件的容器時,會自動呼叫預設的建構函式。 舉例如下:
#include #include using std::cout; using std::endl; using std::vector;
class student // 1 // student(int val) : val(6){} // 2 int val; };
void main()
若將student定義體中的注釋1去掉,即自定義無參建構函式,則main函式中的幾種形式的物件定義都會呼叫該自定義的無參建構函式;
但只將注釋2去掉,即自定義帶參構造,而不提供無參構造,則main函式的幾種形式的物件定義都將因為沒有可用的預設建構函式而編譯出錯。
nontrivial default constructor。
那麼編譯器這樣做的理由是什麼?
答案是因為類成員物件有nontrivial default constructor,那麼編譯器就需要顯式的來呼叫這個類成員物件的nontrivial default constructor。而編譯器想顯式的呼叫類成員物件的nontrivial default constructor,就需要自己來合成一些**來呼叫。但是記住,編譯器合成的nontrivial default constructor僅僅呼叫類成員物件的預設建構函式,而不對我們類裡面的其它變數做任何初始化操作。
也就是說,如果你想初始化類成員變數以外的變數,例如乙個int、乙個string,那麼必須自己定義預設建構函式來完成這些變數的初始化。而編譯器會對你定義的預設建構函式做相應的擴充套件,從而呼叫類成員物件的nontrivial default constructor。
②如果乙個派生類的基類有nontrivial default constructor,那麼編譯器會為派生類合成乙個nontrivial default constructor。
編譯器這樣的理由是:因為派生類被合成時需要顯式呼叫基類的預設建構函式。
③如何乙個類裡面隱式的含有任何virtual function table(或vtbl)、pointer member(或vptr)。 編譯器這樣做的理由很簡單:因為這些vtbl或vptr需要編譯器隱式(implicit)的合成出來,那麼編譯器就把合成動作放到了預設建構函式裡面。所以編譯器必須自己產生乙個預設建構函式來完成這些操作。
所以如果你的類裡帶有任何virtual function,那麼編譯器會為你合成乙個預設建構函式。 ④如果乙個類虛繼承於其它類。
編譯器這樣做的理由和③類似:因為虛繼承需要維護乙個類似指標一樣,可以動態的決定記憶體位址的東西(不同編譯器對虛繼承的實現不僅相同)。
那麼除了以上四種情況,編譯器並不會為我們的類產生預設建構函式。
所以程式設計中切忌想當然,要明白哪些事情是編譯器做的,哪些事情需要程式設計師來完成的。就像堆所占用的資源需要程式設計師自己來釋放,而棧空間是編譯器管理的一樣。
只有如此,才能編寫出質量更高的**。
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 函式引數預設值
函式引數在有預設值時,如果呼叫時沒有傳參,則預設push預設值。例項一 不帶預設值 include using namespace std intfun int a,int b,int c int main intfun int a,int b,int c 例項二 函式宣告與定義衝突 函式的預設值在...
C 構造器(建構函式)
定義和作用 構造器是在構建類的 引用時 自動執行的方法。所以,每個類都必須至少要有乙個構造器。在訪問乙個類的時候,編譯器最先執行構造器中的 它與類同名,帶引數的構造器能夠獲取引數,但是與方法不同的是 構造器雖然也是一種 例項型別 即必須通過例項來進行呼叫,也可以稱之為引用型別 但是卻不能返回任何值 ...