C 中類的組合與建構函式

2021-07-15 06:58:47 字數 1262 閱讀 4005

首先看看建構函式的概念。在程式執行過程中,當遇到物件宣告語句時,程式會想作業系統申請一定的記憶體空間用於存放新建的物件。而編譯器不知道如何產生**來實現初始化。所以c++做了一套物件初始化的機制,就是建構函式。

然後是類的組合中,當建立類的物件時,如果這個類具有內嵌物件成員,那麼各個內嵌物件將首先被自動建立。和上面的解釋來看,建立的時候就會被分配空間,並且自動呼叫建構函式來進行初始化。在建立物件時既要對本類的基本型別資料成員進行初始化,又要對內嵌物件成員進行初始化。先內嵌物件構造,然後再是本來進行構造。在內嵌物件的構造中,初始化的順序是根據內嵌物件在類中的宣告順序,而不適合類的初始化列表的順序。

在組合類的構造中有特殊的情況,比如有些內嵌物件沒有在建構函式的初始化列表中,那麼該內嵌物件的預設建構函式將會被執行。記住是預設建構函式,如果我們自己重新定義了建構函式的話,這個預設建構函式就不存在了,而缺省會呼叫我們定義的建構函式,並且這個建構函式不能帶引數。

然而需要注意的是,有些資料成員的初始化必須在建構函式的初始化列表中進行。一類是沒有預設建構函式的內嵌物件—–因為這類物件初始化時必須提供引數,另一類是引用型別的資料成員—–因為引用型變數必須在初始化時繫結引用的物件。引用型變數就是帶&的物件宣告。

下面看這個例子中讓我困惑了半天的地方:

在這個例子中首先犯的錯是定義了乙個clock帶引數的建構函式,但在clockx中宣告了clock c 確將其新增到clockx的建構函式列表中,這個時候編譯器認為沒有建構函式去初始化c。如果引數在列表中,那麼意味著c是要靠外部構造好了的物件來複製構造自己。如在main函式中clock c(「aaa」);已經構造了乙個c ,然後將這個c傳參到clockx cx(c)中,則clockx中的c就被初始化了。clockx中的c和main中的c是不同作用域的。所以用的時候必須是cx.c.showtime()。

來看另外乙個錯誤:

這裡clockxd中宣告了clockd c ,而沒有定義帶初始化列表的建構函式,那麼系統會預設呼叫clockd的預設建構函式,而這個預設建構函式被clockd(const …..)給替代了,所以系統報錯。因此需要增加乙個名為clocked(){};的不帶引數的建構函式,在能被clockxd預設構造。

以上幾點是《c++語言程式設計》中的知識,在程式設計中困惑了好久,看來基本功很重要。例子在src/clock.cpp中可以復現。

c 中建構函式,複製建構函式,組合類的說明

c 中建構函式的種類很多 預設建構函式,無參建構函式,過載建構函式,複製建構函式 拷貝建構函式 型別轉換建構函式,符號過載建構函式。一般在用類定義物件時候,如果類中無顯示的定義建構函式,那麼就呼叫系統都預設建構函式 無參建構函式 無參建構函式一般指顯示定義了建構函式,但是建構函式沒有傳參,一般只為成...

C 中的類與建構函式

如 myteacher.h 防止重複引入 pragma once class myteacher 如 myteacher.cpp define crt secure no warnings include myteacher.h include void myteacher setname cons...

C 中類的建構函式與複製建構函式

建構函式是類的特殊的成員函式,只要建立類型別的新物件,都要執行建構函式。建構函式的工作是保證每個物件的資料成員具有合適的初始值。建構函式的名字與類的名字相同,並且不能指定返回型別。像其他任何函式一樣,它們可以沒有形參,也可以定義多個形參。複製建構函式是一種特殊建構函式,具有單個形參,該形參 常用co...