2011-10-08 47 views

回答

10

它是C的剩餘部分。您可以在cladd/struct/enum聲明後聲明變量。驗證碼:

class A{}; 
A a; 

是相同的:

class A{} a; 

編譯器需要;知道你不想類聲明後,聲明變量。

2

爲什麼你必須在C++中的類,結構或枚舉的後括號之後加上一個分號?

真正的答案,因爲C++標準是這樣說的。該語言的設計方式使每個聲明都必須以;結尾。

一個類對象可以被聲明爲:

class MyClass 
{ 
    //Members  
}obj; 

並且因此在;支架的端部。

更糟糕的(或實際的問題),爲什麼編譯器發出錯誤時,他們可以簡單地發出警告?

當懷疑的東西可能是錯誤的或潛在的危險,編譯器會發出警告

當程序不遵循該標準中規定的語法準則,而忽略了分號,編譯器將發出錯誤在你提到的情況下違反了C++標準提到的語法規則,因此也是錯誤。

8

將分號放在那裏真的很重要嗎?爲什麼?

是的。這可能有用。

您可以定義一個結構,並可以申報對象:

struct A 
{ 
    //members 
} obj; 

objA類型的對象,並且聲明這只是如上圖所示。它是在相同的方式,把分號聲明變量之後,如:

int i;      //declares i of type int 
std::string s;    //declares s of type std::string 
struct {int x,y,z;} point; //declares point of an unnamed struct type 

這裏前兩個聲明看起來很熟悉,但最後一個看起來略顯陌生,因爲它定義了一個不願透露姓名的結構,並同時聲明一個對象稱爲point未命名的結構。

底線是,在統一聲明對象後放置分號,無論聲明對象的方式如何,無論其類型如何。

不僅如此,你甚至可以typedef以統一的方式:

typedef int my_int; 
typedef std::string my_string; 
typedef struct {int x,y,z;} my_point; 

現在,所有這些my_intmy_stringmy_point的類型。

但是,如果你們兩個都不做(即既不聲明對象也不定義typedef),那麼你只需簡單地留下空白處,不要聲明/定義任何東西。但需要指出的是,它始終爲您提供了一個有趣而實用的功能。

3

類,結構和枚舉的定義是,定義。和C一樣,C中的定義必須以分號結束。 如果你不把它會有很多歧義:

struct X 
{ 
} //no ; 
foo() //no return value 
{ 
} 

這被解讀爲一個函數foo返回一個結構,而不是結構和返回(中省略)的整數的函數。這是有效的C,但不是C++。

int *x; 
void foo() 
{ 
    struct S { } //no ; 
    *x = 3; // <--- what is this? 
} 

是第二xpointer-to-S類型的局部變量,或者是全球x的參考?你根本無法分辨。

還有很多其他的例子,如果你嘗試的話,你可能會想到幾個例子。

+0

函數定義不需要分號,仍然被視爲定義。 –

+0

確實如此,名稱空間也是如此。是的,我過度概括了一下... – rodrigo