7

次のコードは正常にコンパイルされました (各行の後にセミコロンはありません)。public セクションの下の各行の終わりにセミコロンが必要ないのはなぜですか?

注:各行の後にセミコロンを付けても問題ないため、ここでのセミコロンの使用はオプションのようです。

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;
};
4

5 に答える 5

11

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

クラス定義の後にセミコロンが必要な理由は、定義の直後にクラスのインスタンスを宣言できるからです。

class X
{

} x;

//x is an object of type X

メソッドの場合、この引数は明らかに成り立たないため、セミコロンは冗長になります (正当ではありますが)。

于 2012-07-07T15:14:22.123 に答える
7

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

セミコロンを追加しても、何も悪いことは起こりません。セミコロンを含む空のステートメントはノーオペレーションのようなものだからです。たとえば、x += y;;正当な C++ です。

于 2012-07-07T15:00:17.737 に答える
2

メソッド宣言の閉じ括弧の後にセミコロンを付ける必要はありません。私が見たほとんどのコードでは、そのようなセミコロンはありません。

于 2012-07-07T14:59:27.463 に答える
1

明確にするために、

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

と同等です

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

これはメンバー関数の定義です。ここで、関数シグネチャの最後にセミコロンを置くと、以下のようにクラス外のプログラムのどこかで定義する必要があるメンバー関数宣言になります。

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

また、他の回答が示唆するように、関数本体の終わりには閉じ括弧の後にセミコロンは必要ありません (クラスまたは構造定義の終わりにはセミコロンが必要です) が、最後にセミコロンを追加しても違いはありません。ノーオペレーションと見なされるため、最後にセミコロンを追加できます。

于 2012-07-07T15:18:10.707 に答える
0

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

于 2012-07-07T14:59:48.720 に答える