C++中的可选分号

Optional semicolon in C++

本文关键字:C++      更新时间:2023-10-16

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

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

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

方法定义后不需要分号。

类定义后需要分号的原因是,您可以在定义后立即声明类的实例:

class X
{
} x;
//x is an object of type X

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

您的代码是正确的。这就是语言的运作方式;方法/函数实现的正文后面不需要分号。

如果添加分号,不会发生任何错误,因为带有分号的空语句就像no-op。例如,x += y;;是合法的C++。

您不必在方法声明的右括号后面放分号。在我看到的大多数代码中都没有这样的分号。

要明确的是,

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

相当于

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

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

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

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

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

相关文章:
  • 没有找到相关文章