繁体   English   中英

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

[英]Is it a syntax error in C++ to end a function inside a class definition with a };?

这段代码由我的老师提供给我,作为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;
};

它是合法的,并且一直是合法的(从C ++ 98开始),但是它的语法意义; 已从C ++ 11更改为C ++ 14。

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

成员声明:
decl-specifier-seq opt member-declarator-list 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模式下拒绝它。)

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM