C ++的新手。
在一个项目上进行分配,在一些示例代码中,我发现了以}结尾的方法;而不是典型的(预期的)}
例如:
CircBuffer::CircBuffer()
{
cout<<"constructor called\n";
cout<<"Buffer has " << BufferSize << "elements\n";
for (int i = 0; i<= BufferSize -1; i++)
{
Buffer[i] = 0;
}
ReadIn = WriteIn = 0;
setDelay(0);
}; // <=== HERE
我找不到任何关于为什么要在网上完成此操作的信息。
谢谢,刘易斯
答案 0 :(得分:10)
命名空间作用域中的尾随;
构成空声明。编译器将上述代码中的内容视为
CircBuffer::CircBuffer()
{
...
} // <- the `CircBuffer::CircBuffer` definition ends here
; // <- an empty declaration that declares nothing
即。从编译器的角度来看,方法定义并不真正以};
结束。它以}
结尾,;
完全独立且独立地处理。
在C ++的原始版本和C ++ 03中,空声明是非法的,但它在C ++ 11中已合法化。因此,您在上面引用的代码在C ++ 98和C ++ 03中无效,但在C ++ 11中是合法的。但是,即使是C ++ 98编译器也经常支持空声明作为非标准扩展。
请注意,上述内容仅适用于类外函数定义(如示例所示)。使用类内成员函数定义,尾随;
始终是合法的(和可选的)
class C
{
C()
{
...
}; // <- ';' not required, but legal even in C++98
};
(在这种情况下,可选的;
实际上是成员定义的一部分,这意味着定义确实以};
结尾,并且不引入空声明。)
当你在实际代码中看到类似的东西时,它可能只是一个坏习惯,可能是基于类内和类外定义上下文之间的混淆。
答案 1 :(得分:1)
可能是为了保持一致性,或者它可能让人联想到旧代码,例如,如果原始代码只是一个声明:
CircBuffer::CircBuffer();
并且有人想要添加内联实现,他可能在尾随;
之前点击并开始在那里写主体,忘记删除;
。