2009-04-24 22 views
62

謝罪はおそらく愚かな質問ですが、C++クラスではなぜ閉じ括弧の後にセミコロンが使われますか?私は定期的にそれを忘れて、コンパイラのエラーを取得し、したがって時間を失った。私にはいくぶん余計に見えますが、そうは思わしくありません。人々は本当にクラス宣言後のセミコロン中括弧

class MyClass 
{ 
. 
. 
. 
} MyInstance; 

編集のようなものを行うのです:私は、構造体や列挙型のためのビューのCの互換性の点から、それを得るが、クラスは、C言語の一部ではないので、私はそれは主にそこキープだと思います類似の宣言構造間の一貫性。私が探していたのは、良いコード補完IDEがコンパイル前にこれをトラップするかもしれませんが、何かを変更するよりも、設計の根拠に関連していました。

+4

これは役立つかもしれない:http://www.cpptalk.net/confused-about-the-meaning-of-the-semicolon-vt11965.html –

+0

@Michael、感謝のコードは次のように解析されますリンクのために。歴史的な観点からは、C++がすべてのCグラマーを許可し、C++クラスが構造体と同義である場合、クラスの最後に必要なセミコロンが残っています。 –

+3

@Brian、はい、深刻な質問です。私はそれを使って生きなければならないことはよく知っていますが、設計と実装の背後にある根拠については興味があります。 –

答えて

38

タイプ宣言の中括弧の後にセミコロンが必要です。 Cの初期のバージョンからそのようになっています。

はい、実際にあなたがそこに置いた宣言を実際に行います。メソッド内にスコープ付きの型を作成するのに便利です。

void Example() { 
    struct { int x; } s1; 
    s1.x = 42; 

    struct ADifferentType { int x; }; 
} 

この場合、セミコロンが必要な理由は明らかです。より一般的なヘッダーファイルで宣言するのがなぜ必要なのかはわかりません。私のと推測されています。これは歴史的なことであり、コンパイラの作成を容易にするためです。

+0

MyInstanceを指定せずにスコープタイプを作成できないのはなぜですか?新しいタイプを宣言し、新しい変数を宣言するという2つのアクションを組み合わせると、奇妙なことが起こります。 –

+0

@Mykolaあなたは両方を行うことができます。私が追加したサンプルを参照してください – JaredPar

15

私は、グループ化のための中括弧が必要な場合でも、クラスは宣言であると思います。そして、はい、以来、Cであなたが

struct 
{ 
    float x; 
    float y; 
} point; 

を行うことができることを歴史的な引数がありますあなたがCで同様のことを行うことができる++なければならない、それは同じように動作するclass宣言に意味があります。

7

それは

class MyClass 
{ 
. 
. 
. 
}; 

// instance declaration 
MyClass MyInstance; // semicolon here 

クラス宣言の中括弧は、実際にやり過ぎた後のセミコロンのために短いですが、それはC++が定義されている方法です。変数宣言後のセミコロンは常に必要となり、意味があります。

+0

C++は各宣言の後にセミコロンを必要としますか? –

+0

この方法では、匿名クラスのオブジェクトを作成することはできませんが、逆も可能です。 – Kevin

2

私は、このような宣言

class MyClass 
{ 
. 
. 
. 
} MyInstance; 

を使用していない。しかしそこにセミコロンなぜこのような場合には、私は理解することができます。
int a; - 変数宣言のようなものです。

「MyInstance」を省略できるので、一貫性があると思われます。セミコロンはそこにとどまるでしょう。

2

これは、互換性の理由struct後に必要とされており、どのようにこのようになります。

C/C++で
struct MyStruct { ... }; 
class MyClass { ... } //inconsistency 
2

。文のターミネータです。 すべての文は、で終了します。あいまいさを避けるため(および解析を簡略化するため)。 文法はこの点で一貫しています。 は、クラス宣言(またはそのブロック)が複数行で、{}で区切られた であるにもかかわらず、単にステートメント({}はステートメントの一部です)であるため、 は終了する必要があります。

class MyClass{...} MyInstance; 

は完全なステートメントであるあなたの例では

;(セパレータ/ delimitorではありません)。

int a, b, c; 

1にはない理由: 一つは、単一の文これは、単一のステートメントでは、プリミティブ型の複数のインスタンスを宣言すると完全に一致している

class MyClass{...} MyInstance1, MyInstance2; 

で宣言されたクラスの複数のインスタンスを定義することができますしばしばそのようなクラスとインスタンスのdesclarationを参照してください、インスタンスはできますか?グローバル変数であり、静的および/またはPlain Old Data構造でない限り、実際にはグローバルオブジェクトを頻繁に使用する必要はありません。

+0

しかし、関数定義もステートメントですがセミコロンはありません。 –

39

@MichaelHeranによって提供されたlinkは、根本原因を提供するように見えます。セミコロン(他の人が指摘しているように)はCから継承されていますが、なぜCがそれを最初に使ったのかは説明していません。議論は、例のこの宝石を含む:特に宣言されない限り、Cの

struct fred { int x; long y; }; 
main() 
{ 
    return 0; 
} 

古いバージョンは、関数から暗黙のint戻り型を有していました。構造定義の最後に;を省略すると、新しいタイプのfredを定義するだけでなく、main()fredのインスタンスを返すと宣言しています。私。

struct fred { int x; long y; } main() 
{ 
    return 0; /* invalid return type, expected fred type */ 
} 
+4

これは受け入れられる回答である必要があります。 – nikoliazekter