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模式下拒绝它.)
这完全有效.额外的分号分隔"空"声明.
这不是一个"怪癖",因为它在非成员函数之后也是有效的.
但是,当你不需要的时候使用它是很奇怪的;,所以我不知道为什么你的老师会这样向你展示.这取决于你,但我通常建议不要使用额外的;(和你的编译器一样,如上面代码所发出的警告所示,与我一致).
当然,你可以简单地尝试一下来找出答案.