这段代码由我的老师提供给我,作为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;
};
答案 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)
';'可以看作是一个什么都不做的空句子。为了使代码干净,对于那么多在类中没有任何作用的空子句来说,这不是一个好方法。