C ++中的可选分号

时间:2012-07-07 14:57:03

标签: 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;
};

5 个答案:

答案 0 :(得分:10)

在方法定义之后,您不需要分号。

在类定义之后需要分号的原因是你可以在定义之后声明类的实例:

class X
{

} x;

//x is an object of type X

对于方法,这个论点显然不成立,所以分号是多余的(虽然合法)。

答案 1 :(得分:6)

您的代码是正确的。这就是语言的运作方式;在方法/函数实现的主体之后,你不需要分号。

如果添加分号,则不会发生任何不良情况,因为带分号的空语句就像是无操作。例如,x += y;;是合法的C ++。

答案 2 :(得分:1)

您不必在方法声明的结束括号后面加上分号。在大多数代码中,我看到没有这样的分号。

答案 3 :(得分:1)

要清楚,

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

相当于

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

哪个是成员函数定义。这里在函数签名的末尾加一个分号使它成为一个成员函数声明,需要在类之外的程序中的某个地方定义,如下所示

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

另外,正如另一个答案所示,函数体的结尾在结束括号之后不需要分号(类的结尾或结构定义确实需要它)但是在结束不会有所作为,因为它被认为是无操作,这就是为什么你可以在结尾添加分号。

答案 4 :(得分:0)

因为C ++规则在函数/方法声明中}之后不需要分号。