7

以下代码编译良好(每行后没有分号)。为什么公共部分下的每行末尾不需要分号?

注意:在每行之后放一个分号也可以,所以在这里使用分号似乎是可选的。

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 回答