2013-03-19 35 views
10

爲什麼要使用typedef class {} NameC++ typedef類使用

我在IBM C++ doc瞭解到這一點,這裏沒有提示。

+6

遺產從C.不要使用。 – 2013-03-19 14:05:50

+1

我個人認爲這個問題值得downvotes。我也反對使用這個建議,但這是一個公平的問題。也許解釋**爲什麼**會在這裏做得更好。 – 2013-03-19 14:07:48

+0

@IvayloStrandjev - 同意了,我只是寫同樣的。這真是醜陋而不必要的,我有點驚訝,它在IBM的文檔中使用。 – 2013-03-19 14:11:03

回答

22

這是從'C'語言的宿醉。

在C,如果你有

struct Pt { int x; int y; }; 

然後宣佈這個結構的變量,你需要做的

struct Pt p; 

的類型定義有助於你避免在C

typedef struct { int x; int y; } Pt; 

現在你可以做

Pt p; 
在C.

在C++中,這是因爲

class Pt { int x; int y; }; 

允許你做

Pt p; 

它提供了C中沒有記法的好處++因爲它在C.確實是從來沒有必要OTOH,它會導致限制,因爲這種語法不提供任何構建或破壞的機制。

即,您不能在構造函數或析構函數中使用名稱typedef名稱。

typedef class { int x; int y; } Pt; 

你不能有一個叫Pt的構造函數,也不能有析構函數。 因此,在大多數情況下,你不應該在C++中這樣做。

+0

謝謝!關於C的益處呢? Steve Jessop描述的那個? – octoback 2013-03-19 14:08:52

+0

你當然可以從'Pt' – 2013-03-19 14:17:31

+0

它仍然繼承說:「沒有提供任何的繼承機制」 – 2013-03-19 14:38:42

3

此答案假定課堂中有一些有趣的內容,而不僅僅是{}

在C++中,可以使用與類相同名稱的函數(爲了與C兼容),但幾乎不想。

你不能有一個與typedef同名的函數,所以這樣做可以保護你免受不守規矩的名稱選擇。幾乎沒有人打擾,即使你去打擾你可能會寫:

class Name {}; 
typedef Name Name; // reserve the name 

如果你指的是真正的代碼是寫(我不能按照看見它你鏈接),那麼它就像class Name {};(這是一個特殊的東西要寫,爲什麼你會稱空類Name?),但修改爲上述考慮。

+0

我不知道typedef名稱的這種特殊處理。要知道!另外,我發現令人驚訝並且可能令人不安的是'typedef A';'是被允許的。 – Agentlien 2013-03-19 14:27:22

+0

玩弄了一下它之後,我可以看到,大多數編譯器似乎描述來實現它,但是我無法找到在標準的相關章節。你認爲你可以提供幫助嗎? – Agentlien 2013-03-19 14:32:37

+0

@Agentlien:這是特殊處理的類名,而不是類型定義。 C++ 11中的相關位是3.3.10/2([basic.scope.hiding])。 – 2013-03-19 15:00:33