2012-07-07 1 views
7

次のコードは、(各行の後にセミコロンを付けずに)うまくコンパイルされました。なぜ公共セクションの下の各行の終わりにセミコロンが必要ないのですか?C++のオプションのセミコロン

注:各行の後にセミコロンを置くこともできますので、セミコロンを使用するように思われます(オプション)。

template<typename T> 

class Accessor { 

    public: 

     explicit Accessor(const T& data) : value(data) {} 

     Accessor& operator=(const T& data) { value = data; return *this; } 
     Accessor& operator=(const Accessor& other) { this->value = other.value; return *this; } 
     operator T() const { return value; } 
     operator T&() { return value; } 

    private: 

     Accessor(const Accessor&); 
     T value; 
}; 
+0

これらのステートメントは、関数(メソッド)定義です。関数本体の後ろに ';'を置く必要はありません。 –

+0

これをチェックアウトする:http://stackoverflow.com/questions/785686/in-c-classes-why-the-semi-colon-after-the-closing-brace – Jack

+0

IIRC、GCCの '-pedantic'は、関数定義の後にセミコロンを入れてください。 – chris

答えて

1

メソッド宣言の閉じ括弧の後ろにセミコロンを置く必要はありません。ほとんどのコードでは、セミコロンはありません。

+0

これは正しくありません。セミコロンがmain()の前に省略されている場合、コンパイルされません。 –

+0

main()の前にどういう意味ですか?クラス宣言の後、同じファイルのmain()を参照していますか? – davidrac

+0

はい。クラス宣言の後、同じファイルのmain()を参照しています。 –

0

関数/メソッドの宣言では、C++の規則では、}の後にセミコロンは必要ないためです。

+0

大括弧の末尾は通常、セクションステートメントの終わりなどのセクションの終わりを示します。したがって、最後のクラスステートメントの後にセミコロンを付けずにmain()関数を実行すると、コンパイラーはコンパイルされません。 –

6

コードは正しいです。それが言語の仕組みです。メソッド/関数実装の本体の後にセミコロンは必要ありません。

セミコロンを追加した場合、セミコロンを含む空のステートメントはノーオペレーションのようなものなので、何も問題はありません。たとえば、x += y;;は合法的なC++です。

10

メソッド定義の後にセミコロンは必要ありません。 、

class X 
{ 

} x; 

//x is an object of type X 

は方法の場合、この引数は明らかに保持していないので、セミコロンはなります

セミコロンは、クラス定義の後に必要とされる理由は、あなたが正しい定義の後にクラスのインスタンスを宣言することができるということです冗長(合法ではあるが)。

+0

+1。良い説明。だからクラス/構造体の本当の理由で、列挙型にはaが必要です。括弧の後に:) – Jack

+0

セミコロンをアクセサー(constアクセッサー&)の後に省略するとどうなりますか?これはメソッドではありませんか?セミコロンを省略すると、コンパイラはコンパイルされません。 –

+1

@ZzzZzこれは、プログラムのどこかで定義する必要があるメンバ関数の宣言です。私の答えで言及された他のものは、クラス内に記述されたメンバー関数定義です。 –

1

explicit Accessor(const T& data) : value(data) {} 

は、メンバ関数の定義である

explicit Accessor(const T& data) 
:value(data) // initializer list 
{ 
} 

に相当し、明確にすること。ここでは、関数のシグネチャの最後にセミコロンを置くことは、それも

Accessor::Accessor(const T& data) 
{ 
    // some code 
} 

以下、他の答えが示唆するように、終わりのようにクラスの外にプログラムのどこかで定義する必要がメンバー関数宣言ます関数本体の末尾にセミコロンを付ける必要はありません(末尾にはのクラスまたは構造体定義が必要です)。最後に1つ追加すると、何もしないとみなされるため、違いは生じません。最後にセミコロンを追加できる理由です。

関連する問題