2014-02-11 20 views
1

我很生鏽,我的C++。這是使用數組來存儲數據項的包類的頭文件中的類聲明的開始。它應該起到,你猜對了,一個包。我得到了第一行,但之後我不太明白髮生了什麼。這似乎相當普遍,所以我認爲這裏有足夠的信息來獲得幫助。有人可以幫我解密這些typedef-ing行的語法嗎?

class bag 
{ 
public: 
    // TYPEDEFS and MEMBER CONSTANTS 
    typedef int value_type; 
    typedef std::size_t size_type; 
    static const size_type DEFAULT_CAPACITY = 30; 
+0

可能的重複[什麼是typedef的使用?](http://stackoverflow.com/questions/2566027/what-is-the-use-of-typedef) – Conner

+0

也許重複的另一個職位,但不是。第二個陳述令人困惑。我沒有看到任何幫助。 – Beezly

+0

你怎麼理解第一個typedef,但不是第二個?這是同一件事!或者你被'std ::'命名空間說明符弄糊塗了嗎? –

回答

5
typedef int value_type; 

這一行定義該類型袋含有另一種類型稱爲「VALUE_TYPE」即同一個int。

typedef std::size_t size_type; 

該行定義了類型bag包含另一個類型叫做「size_type」,它與std :: size_t相同。

static const size_type DEFAULT_CAPACITY = 30; 

這一行定義類型「SIZE_TYPE」的恆定(看線之上,以檢查它是什麼),其被稱爲DEFAULT_CAPACITY與30

值這就是基本的C++和我不我不知道如何解釋它,而不是拼出語法。

+2

有人可能會補充說'typedef int value_type'可能已經被做成可以容納袋子的物品的類型,所以如果你突然想要你的袋子保持雙打,那麼你可以將該行更改爲'typedef double value_type '而不是在你的源代碼中搜索'int'變量,並決定每個變量是否應該改爲雙精度。當然,更通用的方法是模板化。 –

+0

好吧,那麼我想大問題是什麼是「一個std :: size_t」? – Beezly

+1

@Beezly它是標準庫的一部分,一個實現定義了unsigned int類型。 – nvoigt

2

我用typedefs找到的技巧是首先忽略typedef關鍵字並查看其他位;所以

int value_type; 

將聲明一個稱爲int類型的value_type變量。添加typedef關鍵字,並且完全相同,但不是聲明新的變量,而是聲明新的類型這是一個int

我覺得這是有幫助的更復雜的情況下,像

typedef int (*Func)(float, double); 

刪除typedef,你就宣佈了一個名爲*Func函數,它接受兩個參數並返回一個int。將關鍵字添加回來,並且您正在聲明具有該簽名的功能類型

編輯:

從其他的答案意見,現在看來似乎不是這麼多的類型定義本身,而是std::size_t是傳給你費心了。

std::size_t本身就是標準庫類型的名稱,具體來說就是內置的sizeof運算符返回的數字的類型。它始終是一個無符號整數,但確切類型取決於編譯器和您使用的系統(甚至是特定的編譯器選項)。

你怎麼知道std::size_t是一個類型名稱,而不是變量名?簡單的答案是,你經常做不到,你只需要根據名稱和上下文來判斷(事實上,有時甚至編譯器甚至不知道名稱是指某個類型還是指向一個變量,所以你必須告訴它)。在這種情況下,它以_t結尾的事實是一個很好的線索,它是一種類型(加上它在typedef中使用的事實!)。

std部分是指std命名空間。命名空間是一個C++工具(也存在於其他語言中,但不是C),用於避免名稱衝突。你可以聲明你自己的,並且std是專門爲標準庫預留的。

A::B東西叫做範圍解析操作,它告訴編譯器「內A尋找名爲B東西」,其中A可以是類或命名空間。

+0

+ +1努力和非常好的提示首先忽略「typedef」關鍵字! –

1

一個typedef的基本語法是:

"typedef" <name of type> <name of alias for type> 

別名的名稱是一個單個標識符。在typedef關鍵字和去年標識符之間的一切必須的名稱/類型爲您正在創建一個別名。當然,對於像指針和引用,特別是像一個別名爲pointer to a function returning int and taking a string and a long as parameters,別名的名稱將是在聲明中間的某個地方掩埋,就像它會在/是如果你聲明一個變量這種類型的(事實上,語法,typedef最初加入C作爲「存儲類」等autoregister,因此它在一個聲明作爲其中將之一佔據完全相同的點)。

因此,在typedef int value_type它創建value_type作爲int的別名。

但是請注意,在這種情況下,value_type嵌套在bag之內,因此名稱的完整名稱是bag::value_type。如果您使用其他容器,則每個容器可能都有一個value_type。例如:

std::vector<unsigned> x; 

在這種情況下,value_type也將是unsigned。對於像std::map這樣的關聯容器,value_type變得更有趣。例如,給定一個地圖,如:

std::map<std::string, int> foo; 

...的value_typestd::pair<const std::string, int>

value_type這些嵌套標識符用於尤其巨資模板代碼,可能需要不同類型的集裝箱(或迭代到這種容器中的內容),因此對於特定的容器中的value_type當代碼被寫入是不知道。例如,如果你想所有項目加在一起在一個容器中,你可以使用容器的value_type對結果的類型,所以當你添加一起vector<int>,其結果將是一個int,但如果你加在一起list<string>,結果將是string

相關問題