建構函式是特殊的成員函式,只要建立類型別的新物件,都要執行建構函式。建構函式的工作是保證每個物件的資料成員具有合適的初始值。
class sales_item
private:
std::string isbn;
unsigned units_sold;
double revenue;
};
建構函式可以被過載
可以為乙個類宣告的建構函式的數量沒有限制,只要每個建構函式的形參表是唯一的。
class sales_item;
實參決定使用哪個建構函式
// uses the default constructor:
// isbn is the empty string; units_soldand revenue are 0
sales_item empty;
// specifies an explicit isbn; units_soldand revenue are 0
sales_item primer_3rd_ed("0-201-82470-1");
// reads values from the standard input into isbn, units_sold, and revenue
sales_item primer_4th_ed(cin);
建構函式自動執行
只要建立該型別的乙個物件,編譯器就執行乙個建構函式.
建構函式不能宣告為 const。
建構函式初始化式
與任何其他函式一樣,建構函式具有名字、形參表和函式體。與其他函式不同的是,建構函式也可以包含乙個建構函式初始化列表:
// recommended way to write constructors using a constructor initializer
sales_item::sales_item(const string &book):
isbn(book), units_sold(0), revenue(0.0)
建構函式初始化列表以乙個冒號開始,接著是乙個以逗號分隔的資料成員列表,每個資料成員後面跟乙個放在圓括號中的初始化式。
在建構函式初始化列表中沒有顯式提及的每個成員,使用與初始化變數相同的規則來進行初始化。執行該型別的預設建構函式,來初始化類型別的資料成員。內建或復合型別的成員的初始值依賴於物件的作用域:在區域性作用域中這些成員不被初始化,而在全域性作用域中它們被初始化為 0。
無論是在建構函式初始化列表中初始化成員,還是在建構函式函式體中對它們賦值,最終結果是相同的。
1、有時需要建構函式初始化列表
有些成員必須在建構函式初始化列表中進行初始化。對於這樣的成員,在建構函式函式體中對它們賦值不起作用。沒有預設造函式的類型別的成員,以及 const 或引用型別的成員,不管是哪種型別,都必須在建構函式初始化列表中進行初始化。
例如,下面的建構函式是錯誤的:
class constref ;
// no explicit constructor initializer: error ri is uninitialized
constref::constref(int ii)
可以初始化 const 物件或引用型別的物件,但不能對它們賦值。
必須對任何 const 或引用型別成員以及沒有預設建構函式的類型別的任何成員使用初始化式。
2、成員初始化的次序
建構函式初始化列表僅指定用於初始化成員的值,並不指定這些初始化執行的次序。成員被初始化的次序就是定義成員的次序。
初始化的次序常常無關緊要。然而,如果乙個成員是根據其他成員而初始化,則成員初始化的次序是至關重要的。
一般情況下,通過(重複)使用建構函式的形參而不是使用物件的資料成員,可以避免由初始化式的執行次序而引起的任何問題。
預設建構函式
只要定義乙個物件時沒有提供初始化式,就使用預設建構函式。為所有形參提供預設實參的建構函式也定義了預設建構函式。
合成的預設建構函式乙個類哪怕只定義了乙個建構函式,編譯器也不會再生成預設建構函式。
只有當乙個類沒有定義建構函式時,編譯器才會自動生成乙個預設建構函式。
內建和復合型別的成員,如指標和陣列,只對定義在全域性作用域中的物件才初始化。當物件定義在區域性作用域中時,內建或復合型別的成員不進
行初始化。
如果類包含內建或復合型別的成員,則該類不應該依賴於合成的預設建構函式。它應該定義自己的建構函式來初始化這些成員。
此外,每個建構函式應該為每個內建或復合型別的成員提供初始化式。沒有初始化內建或復合型別成員的建構函式,將使那些成員處於未定義的狀態。除了作為賦值的目標之外,以任何方式使用乙個未定義的成員都是錯誤的。
實際上,如果定義了其他建構函式,則提供乙個預設建構函式幾乎總是對的。通常,在預設建構函式中給成員提供的初始值應該指出該物件是「空」的。
C Primer 學習筆記 IO類
1.ifstream 和istringstream都繼承自istream,因此對三個類的物件的操作相似 2.io物件不能拷貝不能賦值 io操作的函式形參和返回值型別不能為流型別 進行io操作的函式常以引用方式傳遞和返回流,且不能為const 條件狀態 cin word 如果輸入成功,流會保持有效狀態...
C Primer學習筆記
學習完乙個知識點後寫上自己的理解。算是總結吧,加深一下自己的印象,也可以在以後複習的時候方便檢視 加油加油!14.1關於運算子的過載 存在的意義 目前看來就是因為操作符大部分是針對資料的,比如int型,char型,書中稱為內建型別。而當類之間想要用操作符的時候,比如兩個類的物件相加,那麼就需要去重 ...
《C Primer》學習筆記
2008年7月18日 颱風海鷗登陸 1 宣告與定義 變數的定義用於為變數分配儲存空間,還可以為變數指定初始值。在乙個程式中,變數有且僅有乙個定義。變數的宣告用於向程式表明變數的型別和名字。變數的宣告包括物件名 物件型別和物件型別前的關鍵字extern 當設計標頭檔案時,記住定義和宣告的區別是很重要的...