为什么有必要在函数定义中包含返回类型,即使它在声明中指定了?

时间:2016-05-13 20:49:51

标签: c++

当你在一个单独的cpp文件中定义一个函数时,如果编译器知道一个方法不能重载具有相同签名的另一个方法只有不同的返回,为什么需要返回类型来指示你想要定义哪个特定函数类型?是不是foo :: bar(params)足以指定这个?

标头文件

class foo{
public:
void bar();
};

源文件

foo::bar() //equivalent to function declaration? throws error
{...}

谢谢

4 个答案:

答案 0 :(得分:10)

我认为没有任何内在的原因可以做到这一点,但使用它会导致不一致。毕竟,如果函数的定义可见,则不必声明函数,但在这种情况下,您必须包含返回类型。所以具有前面声明的函数定义不需要返回类型,但是函数定义不需要。如果您删除了声明,则必须重写该定义。总是太过摆弄。

编辑:当你查看函数的定义时,更不用说在你面前有返回类型的便利。

答案 1 :(得分:2)

它似乎不是C ++的设计目标,可以消除程序中所有可能的冗余。

这甚至不是一个好目标,至少在极端情况下是这样。

在两个地方重复相同的信息很有用,如果它们发生冲突就会标记错误。

某些编程语言在基本控制语法中内置了冗余,例如while condition ; do .. if condition ; then .... end if; ... end while; while必须由end while终止,if必须由end if终止。$router然后编译器确切地知道缺少哪一个。这些语言的支持者坚持认为,这比关于十五个可能未关闭的大括号中的一个的诊断要好。 :)

在定义中重复的返回类型也以另一种方式对程序员有帮助:程序员不必跳转到声明以查看返回类型是什么。

在某些情况下,删除返回类型实际上需要额外的工作。标题中的声明可以通过精确复制和粘贴生成。甚至使用自动化工具。您不希望使用标题生成工具从定义中删除返回类型。

我们首先应该质疑声明的必要性。函数的定义是主要的工件;声明是为了特定的编译模型而被考虑的因素。换句话说,问题是"鉴于我们有一个函数定义,为什么我们必须在任何地方重复它的任何部分"。

答案 2 :(得分:1)

就这么简单。如果未定义返回类型,则定义函数。根据定义,函数声明必须具有返回类型。想想前面声明的功能。您始终在前向声明和定义中定义返回类型。为什么?因为如果你不这样做,就不适合函数的语法。

答案 3 :(得分:0)

我认为从逻辑上讲,这不是必要的。

但是C ++从C继承了它的声明符语法,其中定义也是一个声明。声明需要返回类型。

并且,尽管存在明显的不兼容性(成员函数,对于一个),没有理由故意偏离此。

如果要编写一种全新的语言,您可以将其定义为定义的返回类型是可选的,只要定义不是声明。如果你问我,预定义声明将成为强制性的 - 有点麻烦!