88

C++ クラスでは、閉じ中括弧の後にセミコロンがあるのはなぜですか? 私は定期的にそれを忘れてコンパイルエラーが発生するため、時間を失いました。私にはやや不必要に思えますが、そうではない可能性があります。人々は本当に次のようなことをしますか?

class MyClass
{
.
.
.
} MyInstance;

私は構造体と列挙型の C 互換性の観点からそれを取得しますが、クラスは C 言語の一部ではないため、主に同様の宣言構造間の一貫性を維持していると思います。

私が探していたのは、何かを変更できるというよりも、設計の根拠に関連するものでしたが、優れたコード補完 IDE はコンパイル前にこれをトラップする可能性があります。

4

8 に答える 8

78

@MichaelHaren によって提供されたリンクは、根本的な原因を提供しているようです。セミコロン (他の人が指摘しているように) は C から継承されています。ディスカッションには、この宝石の例が含まれています。

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

C の古いバージョンでは、特に宣言されていない限り、関数からの暗黙的な int 戻り値の型がありました。構造定義の最後でを省略する;と、新しい type を定義するだけでなく、 のインスタンスを返すfredことを宣言することになります。つまり、コードは次のように解析されます。main()fred

struct fred { int x; long y; } main()
{ 
  return 0; /* invalid return type, expected fred type */
} 
于 2014-05-22T14:53:57.093 に答える
52

型宣言の右中括弧の後のセミコロンは、言語で必要です。C の最初のバージョンからずっとそうでした。

そして、はい、人々はあなたがそこに掲げた宣言を実際に行っています。メソッド内でスコープ型を作成する場合に便利です。

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

  struct ADifferentType { int x; };
}

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

于 2009-04-24T12:50:58.010 に答える
17

グループ化のために中括弧が必要な場合でも、クラスは宣言であるためだと思います。そして、はい、C では次のことができるという歴史的な議論があります。

struct
{
  float x;
  float y;
} point;

classC++でも同様のことができるはずです。宣言が同じように動作することは理にかなっています。

于 2009-04-24T12:51:40.130 に答える
11

の略です

class MyClass
{
.
.
.
};

// instance declaration
MyClass MyInstance;  // semicolon here

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

于 2009-04-24T12:52:33.793 に答える
5

私はそのような宣言を使用しません

class MyClass
{
.
.
.
} MyInstance;

しかし、この場合、なぜセミコロンがあるのか​​ 理解できます。- 変数宣言
のようなものだからです。int a;

「MyInstance」セミコロンを省略できるため、おそらく一貫性のためにそこにとどまります。

于 2009-04-24T12:53:45.240 に答える
3

struct互換性の理由から、の後に必要になります。これをどのように行いますか。

struct MyStruct { ... };
class  MyClass  { ... }    //inconsistency
于 2009-04-24T14:30:27.943 に答える
3

C/C++ では、; 文ターミネータです。すべてのステートメントは ; で終了します。あいまいさを避けるため (および解析を簡素化するため)。文法はこの点で一貫しています。クラス宣言 (またはそのブロック) は複数行の長さであり、{} で区切られていますが、それは単なるステートメント ({ } はステートメントの一部です) であるため、; で終了する必要があります。( ; はセパレータ/デリミタではありません)

あなたの例では

class MyClass{...} MyInstance;

完全なステートメントです。宣言されたクラスの複数のインスタンスを単一のステートメントで定義できます

class MyClass{...} MyInstance1, MyInstance2;

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

int a, b, c;

このようなクラスとインスタンスの宣言があまり見られない理由は、インスタンスが唯一の可能性があるからです。グローバル変数であり、静的および/またはプレーンオールドデータ構造でない限り、グローバルオブジェクトが必要になることはあまりありません。

于 2009-04-25T08:00:56.497 に答える
0

class something {...}accum, trans;accum と trans が class の 2 つのオブジェクトになる場所を定義できますsomething。したがって、クラスのsemi-colon後に使用するクラスのオブジェクトを宣言します。

于 2021-11-29T15:56:56.363 に答える