原型声明和前向声明之间的区别?

时间:2017-05-20 14:37:39

标签: c++

所以我有这段代码:

class xx
{
    int getnum(); //Is this a forward declaration or a prototype declaration and why?
};

int xx::getnum()
{
    return 1+3;
}

所以这个问题已经在代码中得到了评论,但是:

int getnum();是前向声明还是原型声明?为什么?

4 个答案:

答案 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而不指定函数体。所以它只适用于函数概念,而不适用于变量,常量或类型。因此,前向声明可以被视为原型声明的超集。

对于上面的例子,根据定义,它既有前向声明,也有原型声明。希望我没错。