所以我有这段代码:
class xx
{
int getnum(); //Is this a forward declaration or a prototype declaration and why?
};
int xx::getnum()
{
return 1+3;
}
所以这个问题已经在代码中得到了评论,但是:
int getnum();
是前向声明还是原型声明?为什么?
答案 0 :(得分:6)
术语"前向声明"也不是"原型声明"在C ++标准中定义,所以非常严格地说,它既不是。它只是一个声明。如果你想更具体,可以称之为非定义声明,或"一个不是定义的声明"
当单词"前进声明"在标准中使用它们,它们用于引用声明但未定义它们声明的事物(函数或类)的声明。根据这种用法,int getnum()
因此是前向声明。
"原型声明"函数的使用在标准(1)中使用得更少,并且大部分是在讨论[与] C的兼容性时。但是,在使用时,它指的是与前向声明完全相同的概念。那个功能。通过这种方式,您还可以将int getnum();
称为原型声明。
总结一下,条款"前瞻声明"和"原型声明"没有正式的定义,但从通常使用和理解的方式来看,int getnum();
可以被描述为。
(1)然而,类似的术语"功能原型范围" 是在标准中定义的(C ++ 17 N4659 [basic.scope.proto] 6.3.4 / 1)。它在非定义函数声明中建立函数参数名称的范围,它是最接近的封闭函数声明符。
答案 1 :(得分:1)
C ++只允许函数的完整原型声明,不像C,int getnum();
之类的东西可能是int getnum(int);
C.1.7第8条:声明者[diff.decl]
8.3.5 更改:在C ++中,使用空参数列表声明的函数不带参数。在C中,一个空的 参数列表表示函数参数的数量和类型是未知的。
示例强>:
int f(); // means int f(void) in C ++, int f( unknown ) in C
基本原理:这是为了避免错误的函数调用(即函数调用错误的数字或类型 参数)。
对原始功能的影响:更改为定义明确的功能的语义。此功能标记为 C中的“过时”。
难以转换:语法转换。必须完成使用C不完整声明样式的函数声明才能成为完整的原型声明。如果对相同(非原型)函数的不同调用具有不同数量的参数或者如果是,则可能需要进一步更新程序 相应参数的类型不同。
答案 2 :(得分:0)
前向声明是程序员尚未给出完整定义的标识符(表示类型,变量,常量或函数等实体)的声明。
另一方面,原型是指函数而不是标识符。
希望以下明确的事情适合你!
int getnum(); // Function prototype. You have not yet implemented the body of getnum() function, thus its a forward delcaration.
class RandomClass; // Forward declaration of RandomClass. You have not yet implemented this class but you need it for the rest of your code.
class xx{
RandomClass *foo; // Our need of having a member like that, made us make a forward declaration of the class RandomClass, above class xx
void BarFunction(); // Function Prototype!
};
int getnum(){ //This is the simply the body of your prototype above. Has nothing to do with the classes
return 1+3;
}
void BarFUnction(){
cout << "foo-bar\n" ;
}
答案 3 :(得分:0)
前向声明是一种声明类型,您可以在其中指定变量,常量,类型或函数的标识符,而无需实现它。它实际上告诉编译器一个具有一些元数据的实体,如名称,大小等。
另一方面,函数的原型声明意味着声明具有名称和类型签名的Function而不指定函数体。所以它只适用于函数概念,而不适用于变量,常量或类型。因此,前向声明可以被视为原型声明的超集。
对于上面的例子,根据定义,它既有前向声明,也有原型声明。希望我没错。