}之间的区别;和}在C ++中

时间:2014-10-08 13:55:36

标签: c++ methods

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

我找不到任何关于为什么要在网上完成此操作的信息。

谢谢,刘易斯

2 个答案:

答案 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();

并且有人想要添加内联实现,他可能在尾随;之前点击并开始在那里写主体,忘记删除;