2013-03-28 78 views
0

有人可以請解釋從C++類模板的以下片段的語法?請解釋這個c + +語法

public: 
explicit Foo(size_t ratio = 500) 
    :list(Bar<I>()) 
    ,vec(Bar<iterator>()) 
    ,n(0), r(ratio){} 

我與編程體面的經驗和理解大多數概念,但是這背後的語法就是這麼國外對我來說,我無法理解。 I是通用類型。具體而言,我不確定這裏顯式的內容是什麼,除了執行一些代碼(例如Foo<int> myfoo;)時發生了什麼。

謝謝!

+1

這回答什麼是明確的很好:http://stackoverflow.com/questions/121162/what-does-the-explicit-keyword-in-c-mean –

+0

你需要[The Definitive C++ Book Guide and List] (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list?rq=1)。請選擇多個。 –

回答

1

這是類Foo的構造函數,但我相信你已經知道這一點。

explicit說這個構造函數必須接收一個參數size_t。也就是說,不能通過任何隱含地轉換爲類型size_t(例如:int)的任何內容。

的事情其餘的都是構造函數的initializer list,這意味着構造的一部分初始化數據成員listBar<I>()

4

explicit關鍵字可以確保你的構造並不選爲一部分用戶 - 用size_t類型的值複製初始化時執行隱式轉換的轉換序列。

沒有explicit關鍵字,例如,以下所有的將是有效的:

Foo<int> bar(Foo<int> f) 
{ 
    return 0; // OK 
} 

Foo<int> f = 1729; // OK 
bar(42); // OK 

聲明你的構造函數explicit防止上面的初始化進行編譯。


接下來構造方法的簽名是initialization list,並用它進入您的構造函數體之前構造你的類的基類子對象和數據成員子對象。

當你做而不是使用一個初始化列表時,你的類的數據成員是默認構造的。但是,如果您的類有const數據成員,或引用類型的數據成員,或者沒有默認構造函數的類類型的數據成員,則這可能不是選項。

+0

現在,什麼是':list','',',n(0),'和'r(ratio){}'?想寫一本書嗎? :-) –

+0

@BoPersson:沒有人會發布它:) –

0

這是Foo的構造函數的定義。構造函數是explicit,這意味着它不會涉及隱式轉換。舉例來說:

void bar(Foo); 
bar(10); // Error - would require an implicit conversion 

標記構造函數爲explicit可以防止這種轉換。

:之後的所有內容都是成員初始化列表。它按名稱列出Foo的成員,括號中包含用於初始化它們的表達式。例如,list將用Bar<I>()創建的臨時對象進行初始化,n0等初始化