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

时间:2016-12-02 23:32:28

标签: c++ function class oop

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

3 个答案:

答案 0 :(得分:18)

这是合法的,并且一直是合法的(自C ++ 98起),但;的句法含义已从C ++ 11改为C ++ 14。

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

  

成员声明:
  decl-specifier-seq opt member-declarator-list opt ;

  功能定义; opt
  :: opt nested-name-specifier template opt unqualified-id;
  使用声明
  模板声明

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

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

  

成员声明:
  attribute-specifier-seq opt decl-specifier-seq opt member-declarator-list opt ;

  函数的定义
  使用声明
  static_assert声明
  模板声明
  别名声明
  空声明

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

class C
{
  void foo() {};;
};

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

答案 1 :(得分:7)

完全有效。额外的分号分隔“空”声明。

这不是真正的“怪癖”,因为it's valid after non-member functions too

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

当然,你可以简单地试一试。

答案 2 :(得分:2)

';'可以看作是一个什么都不做的空句子。为了使代码干净,对于那么多在类中没有任何作用的空子句来说,这不是一个好方法。