宣告建構函式的規則
建構函式的名稱與其類別的名稱相同。 您可以宣告任何數目的建構函式,但受限於多載函式的規則 (如需詳細資訊,請參閱多載)。
class-name ( argument-declaration-list )
備註
argument-declaration-list 可以是空的。
C++ 定義了兩種特殊的建構函式,也就是預設和複製建構函式,如下表所述。
預設和複製建構函式
建構的種類 |
Arguments |
用途 |
---|---|---|
預設建構函式 |
可以在不使用引數的情況下呼叫 |
建構類別類型的預設物件 |
複製建構函式 |
可以接受相同類別類型之參考的單一引數 |
複製類別類型的物件 |
預設建構函式可以在不使用引數的情況下呼叫。 不過,假設所有引數都有預設值,那麼您可以宣告具有引數清單的預設建構函式。 同樣地,複製建構函式必須接受相同類別類型之參考的單一引數。 假設所有後續引數都有預設值,則可以提供更多引數。
如果您未提供任何建構函式,則編譯器會嘗試產生預設建構函式。 如果您未提供複製建構函式,則編譯器會嘗試產生複製建構函式。 這些編譯器產生的建構函式會視為 public 成員函式。 如果您指定的複製建構函式中,第一個引數是物件而不是參考,則會產生錯誤。
編譯器產生的預設建構函式會設定物件 (初始化 vftables 和 vbtables,如先前所述),而且它會呼叫基底類別和成員的預設建構函式,不過它不會採取其他動作。 基底類別和成員建構函式只有在存在、可存取且明確時才會呼叫。
編譯器產生的複製建構函式會設定新物件,並且執行所要複製之物件內容的成員複本。 如果基底類別或成員建構函式存在,則會呼叫它們,否則會執行位元複製。
如果 type 類別的所有基底和成員類別擁有的複製建構函式可接受 const 引數,則編譯器產生的複製建構函式會接受 const type**&** 類型的單一引數。 否則,編譯器產生的複製建構函式會接受 type**&** 類型的單一引數。
您可以使用建構函式初始化 const 或 volatile 物件,不過建構函式本身不能宣告為 const 或 volatile。 建構函式唯一的合法儲存類別是 inline,使用任何其他儲存類別修飾詞 (包括 __declspec 關鍵字) 搭配建構函式都會造成編譯器錯誤。
stdcall 呼叫慣例是在使用 __stdcall 關鍵字宣告且不使用變數引數清單的靜態成員函式和全域函式上使用。 當您在非靜態成員函式 (例如建構函式) 上使用 __stdcall 關鍵字時,編譯器將會使用 thiscall 呼叫慣例。
衍生類別不會繼承基底類別的建構函式。 建立衍生類別類型的物件時,會從基底類別元件開始建構,然後才是衍生類別元件。 編譯器會使用每個基底類別的建構函式 (在完整物件的該部分初始化時,但虛擬衍生的情況除外,如初始化基底類別中所述)。