这是C+中的语法错误吗+;在类定义中用};结束函数;? 这个代码是我的老师给我的,作为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; }; 类泛型项{ 公众: void SetName(字符串newName){ itemName=newName; }; 无效设置数量(整数新数量){ itemQuantity=新建数量; }; 作废打印项(){ cout

这是C+中的语法错误吗+;在类定义中用};结束函数;? 这个代码是我的老师给我的,作为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; }; 类泛型项{ 公众: void SetName(字符串newName){ itemName=newName; }; 无效设置数量(整数新数量){ itemQuantity=新建数量; }; 作废打印项(){ cout,c++,function,class,oop,C++,Function,Class,Oop,“;”可以被视为一个不起任何作用的空子句。为了使代码干净,在类中有这么多不起任何作用的空子句不是一个好方法。它是完全有效的。额外的分号分隔了一个“空”声明 这不是一个真正的“怪癖”,因为 在你不需要的时候使用;是很奇怪的,所以我不知道你的老师为什么用这种方式给你看。这取决于你,但我通常建议不要使用额外的;(从上面代码发出的警告中可以看出,你的编译器同意我的观点) 当然,你可以试着去发现它。它是合法的,而且一直都是合法的(从C++98开始),但它的语法含义从C++11改为C++14 在C++11(

“;”可以被视为一个不起任何作用的空子句。为了使代码干净,在类中有这么多不起任何作用的空子句不是一个好方法。

它是完全有效的。额外的分号分隔了一个“空”声明

这不是一个真正的“怪癖”,因为

在你不需要的时候使用
是很奇怪的,所以我不知道你的老师为什么用这种方式给你看。这取决于你,但我通常建议不要使用额外的
(从上面代码发出的警告中可以看出,你的编译器同意我的观点)


当然,你可以试着去发现它。

它是合法的,而且一直都是合法的(从C++98开始),但它的语法含义从C++11改为C++14

在C++11(及更早版本)中,允许使用
,并且它是成员函数定义的可选部分

成员声明:
decl说明符seqopt成员声明符listopt;
函数定义;opt
::opt嵌套名称说明符templateopt非限定id;
使用声明
模板声明

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

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

成员声明:
属性说明符seqopt decl说明符seqopt成员声明符listopt;
函数定义
使用声明
静态断言声明
模板声明
别名声明
空声明

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

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

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

我记得C++11软化了命名空间范围中关于额外分号的规则,因此现在也允许使用这些分号。您显示的分号是多余的,但除了(1)可能导致愚蠢的警告和(2)之外没有其他危害说明编码器不熟悉C++,不仅类声明以<>代码>结束;数组初始化以<代码> }结束;<代码>例如:
inta[]={0}
@Raindrop7:或者,实际上,任何初始化:
inta{5}在这些示例中
没有结束初始化,结束声明。C++标准的哪一部分说它是有效的?就语法而言,空声明是成员声明。仅供参考,
C++11标准ch 9.2
在成员函数定义后将分号标记为
opt
。@Lightness Races in Orbit:这个答案适用于C++17,但不适用于C++14。C++14不允许在类作用域中使用空声明。在C++14和之前,只有一个可选的
,并且该
是函数定义的一部分,不是空声明。Oops。。。我的草稿如果C++14看起来过时了。11月份的C++14草案已经允许在类范围中使用空声明。因此,作为空声明已经是合法的。好吧,为了保持代码干净,为什么要向类中添加这么多空clouse。答案如下。充实一下。“现在,它光秃秃的,无法支撑自己”。@LightnessRacesinOrbit谢谢你的建议,我接受了。@AnT:Kris一直在绕着“子句”这个词转,所以我今天也学到了一些东西,谢谢你!嗯,标准报价与第一个产品匹配,但缺少两个可选部分。(有一条单独的规则禁止这样做。)作为参考,这一变化是由。由于它是一个DR,编译器可能也会将它追溯到他们的C++11模式。我喜欢这里的例子:两个分号-好,三个分号-坏。