2012-04-26 29 views
1

這個陳述是如何定義的?它是不是應該只是一個聲明,因爲它直到我們定義了一個struct date類型的對象才分配任何內存?這是如何定義的?

struct Date { int d , m , y ; }; 

我readng這本書由Bjarne Stroustrup的名爲「The C++編程語言」,其中有人說(第4.9),這聲明,以及一個定義。

+1

你爲什麼認爲這是一個定義? – Krishnabhadra 2012-04-26 10:15:08

+3

它是一個類型的「定義」,而不是一個變量。 – 2012-04-26 10:17:09

回答

4

這不是在任何一種語言的聲明。 C99定義6.8語句,以及C++ 11限定在6

在C語句,它不是一個定義,這只是一個聲明:C99 6.7/5表示:

的定義的標識符是該標識符的聲明: - 對於一個對象,使存儲到該對象保留; - 對於一個功能,包括功能體; - 用於枚舉常數或typedef名稱,是標識符的(僅)聲明。

既然這三樣東西都不是,那麼它就不是標識符的定義。在C99語法,這是一個結構 - 或聯合說明符(接着分號),這又是一個類型說明符(接着分號),這是允許的之一一個聲明(6.7/1)的形式。

在C++中,這是一個類或符類定義:的C++ 11 9/2說

類說明符是通常被稱爲一個類定義。

在C和C++中,通常都會說「每個定義都是一個聲明」,所以這就是爲什麼Stroustrup說這是聲明和定義的原因。

在C,這是嚴格正確的,因爲上述的「定義」的定義。在C++中,我認爲在文法中實際上並不是真的,類說明符是一個聲明,但類定義引入了一個完整的類型,而類聲明引入了一個不完整的類型。對於一個不完整的類型,你完全可以用完整的類型做任何事情,所以類定義與「struct Date;」這樣的類聲明「一樣好」,並且更好。

0

這是一種新型的struct Date在C和C中的聲明Date ++。聲明不是一個聲明。並且沒有內存保留用於新類型的聲明。

0

它聲明瞭類型Date。它定義了Date小號構件,因此,對象的大小,將創建。

它沒有聲明任何方法,所以不需要爲該類定義其他任何東西來完成。另外,如果你沒有聲明或定義構造函數,析構函數,賦值運算符等,C++將嘗試自動爲你合成它們。所以這個Date的最小定義包括一個默認的構造函數,賦值運算符和析構函數。