C++中的语法错误是用}}结束类定义中的函数吗?

Gal*_*axy 14 c++ oop class function

这段代码由我的老师提供给我,作为C++类中函数的一个例子.这对我来说似乎很奇怪.我一直习惯用a来结束一个函数}.我认为只有类定义以};.这里的函数定义以};.除了公共或私人之外,课堂中的功能与独立功能有何不同?这只是C++的怪癖或特殊之处吗?

class GenericItem {
public:
   void SetName(string newName) {
      itemName = newName;
   };

   void SetQuantity(int newQty) {
      itemQuantity = newQty;
   };

   void PrintItem() {
      cout << itemName << " " << itemQuantity << endl;
   };

private:
   string itemName;
   int itemQuantity;
};
Run Code Online (Sandbox Code Playgroud)

AnT*_*AnT 18

它是合法的,并且一直是合法的(自C++ 98以来),但其语法含义;已从C++ 11改为C++ 14.

在C++ 11(及之前)中,它;是允许的,它是成员函数定义的可选部分.

member-declaration:
    decl-specifier-seq opt member-declarator-list opt ;
    功能定义; opt
    :: opt nested-name-specifier template opt unqualified-id;
    using-declaration
    模板声明

这不是一个空的宣言.(C++ 11不支持类范围中的空声明.仅在命名空间作用域中允许空声明.)因此,在C++ 11(及之前)的情况下,额外;的确实只是语言语法的一个怪癖.为什么它一直被允许对我来说并不完全清楚.

在C++ 14中(根据n4296),这;不再是成员函数定义的一部分.它是一个独立的空声明,从C++ 14开始,它在类范围内是合法的.

member-declaration:
    attribute-specifier-seq opt decl-specifier-seq opt member-declarator-list opt ;
    function-definition
    using-declaration
    static_assert-declaration
    template-declaration
    alias-declaration
    empty-declaration

这基本上意味着以下定义在C++ 11(及之前)中无效,但在C++ 14中有效

class C
{
  void foo() {};;
};
Run Code Online (Sandbox Code Playgroud)

(奇怪的是,GCC在C++ 14模式下拒绝它.)

  • 所以我今天也学到了一些东西,谢谢!嗯,标准报价? (2认同)
  • `;`匹配第一个产品,但两个可选部分都不存在.(有一个单独的规则禁止它.) (2认同)

Lig*_*ica 7

这完全有效.额外的分号分隔"空"声明.

这不是一个"怪癖",因为它在非成员函数之后也是有效的.

但是,当你不需要的时候使用它很奇怪的;,所以我不知道为什么你的老师会这样向你展示.这取决于你,但我通常建议不要使用额外的;(和你的编译器一样,如上面代码所发出的警告所示,与我一致).

当然,你可以简单地尝试一下来找出答案.

  • 就语法而言,_empty-declaration_是_member-declaration_. (4认同)
  • C++标准的哪一部分说它有效? (3认同)
  • 轨道中的@Lightness Races:这个答案适用于C++ 17,但不适用于C++ 14.C++ 14不允许在类范围内使用空声明.在C++ 14中,在类内函数定义之后只允许一个可选的`;`,并且```是函数定义的一部分,而不是空声明. (2认同)
  • 哎呀......如果C++ 14看起来已经过时了我的选秀.11月份的C++ 14草案已经允许在类范围内进行空声明.因此,它已经是合法的空声明. (2认同)

Kri*_*ofe 2

';' 可以看作是一个空子句,什么也不做。为了使代码干净,使用这么多在类中不执行任何操作的空子句并不是一个好方法。

  • @AnT:克里斯一直围绕着“条款”这个词 (2认同)