以下代码编译正常(每行后没有分号)。为什么在公共部分的每一行末尾不需要分号?
注意:在每行之后加一个分号也没关系,所以看起来这里使用分号是可选的。
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 :(得分: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 ++规则在函数/方法声明中}
之后不需要分号。