C primer 7 5 建構函式再探

2021-09-02 17:32:53 字數 2571 閱讀 6057

這兩個函式從執行的結果上看沒有區別,但是

第乙個函式執行的過程相當於

string foo = "abc";
定義並初始化第二個函式執行的過程相當於

string foo;  

foo = "abc";

先定義、再賦值,且在定義時會執行預設初始化

第乙個過程明顯優於第二個

如果沒有在建構函式的初始值列表中顯式地初始化成員,則該成員將在建構函式體之前執行預設初始化

因此推薦使用初始值列表

在宣告變數明:

類似的,當這些型別的變數是類的成員時,必須在初始值列表中初始化

並不是寫在初始值列表前面的成員先被初始化

成員的初始化順序與它們在類定義中出現的順序一致

為了減少不必要的麻煩,盡量避免依賴於順序的初始值列表

class x  

};

盡量避免依賴於順序,修改為

x(int val) : j(val), i(val){}
class sales_data  

};

如果乙個建構函式為所有引數都提供了預設實參,則它實際上也定義了預設建構函式

c++11提供

乙個委託構造使用它所屬類的其他建構函式執行自己的初始化過程

class sales_data

//接下來就是各種偷懶方法了,注意看

sales_data(): sales_data("", 0, 0){} //函式二是預設建構函式,委託函式一幫忙初始化,也可以認為是呼叫了函式一

sales_data(string s): sales_data(s, 0, 0){} //函式三接受乙個string引數,委託函式一幫忙初始化

sales_data(istream &is): sales_data()

//函式四複雜些,它先委託函式二,就是預設建構函式,函式二去委託函式一,這些函式執行完成後,再執行函式四的函式體

//呼叫read函式讀取給定的istream

};

後面的幾個建構函式都委託第乙個建構函式執行自己的初始化過程

委託建構函式的執行過程:

當物件被預設初始化或值初始化時自動執行預設建構函式。

在實際中,如果定義了其他建構函式,最好也提供乙個預設建構函式。

sales_data obj;
執行預設建構函式的邏輯

如果建構函式只接受乙個引數,則它實際上定義了轉換為此類型別的隱式轉換機制。我們把這種建構函式稱作轉換建構函式。

string null_book = "999";  

item.combine(null_book);

上面的**是合法的,但是我們知道combine的引數實際應當是sales_data型別

sales_data &combine(const sales_data&);
所以這裡存在乙個隱式的類型別轉換過程:

編譯器只會自動地執行一步型別轉換

下面的**隱式地使用了兩種轉換規則,所以它是錯誤的

item.combine("999");
正確的寫法是

item.combine(string("999");  

item.combine(sales_data("999"));

通過將建構函式宣告為explicit來阻止

class sales_data

explicit sales_data(istream&);

};sales_data item;

string b = "1"

item.combine(b); //這樣就不行了,因為已經宣告sales_data的string建構函式是explicit的了

explicit sales_data::sales_data(istream& is){} //這樣也不行,在外面了,explicit關鍵字只允許出現在類內的建構函式宣告處

sales_data item1(b); //這樣可以

sales_data item2 = item1; //不行,explicit宣告的不能拷貝初始化

item.combine(sales_data(null_book));  

item.combine(static_cast(cin));

7 5 建構函式再探

目錄7.5.2 委託建構函式 7.5.3 隱式的類型別轉換 7.5.4 類的靜態成員 觀察下面兩段建構函式的 初始化bookno,units sold,revenue sale data const string s,unsigned cnt,double price bookno s units ...

足跡C primer 19 建構函式再探

sales data sales data const string s,unsigned cnt,double price 這個建構函式和這個效果是一樣的 sales data const std string s,unsigned n,double p bookno s units sold n...

建構函式再探

建構函式基礎知識 建構函式初始值列表 初始化與賦值 建構函式使用初始值列表還是在函式體中給資料賦值的區別在於,前者是初始化了它的資料成員,後者是對資料成員執行了賦值操作。在很多類中,初始化和賦值的區別事關底層效率問題 前者直接初始化資料成員,後者則先初始化再賦值。除了效率外更重要的是,一些資料成員必...