2011-03-13 197 views
2

//我们都始终指定函数的返回类型,因为它是在语法.....但谁能告诉我什么基本目标是由我们所服务的指定函数的返回类型.. ........手段为什么语法有一个像这样来进行.....这可能是因为我们可以只返回值..函数的返回类型的需要

+1

它曾经被认为是函数被假定返回'int',如果你没有另外指定。 – Gabe 2011-03-13 07:00:29

回答

7

您必须指定在函数声明的类型因为不是所有的函数声明都是定义。例如,请考虑下面的声明,如果是不需要返回类型,我们可以有:

f(int x); 

什么是f(42)类型?没有办法从这个声明中知道,因此需要指定返回类型。

或者,考虑定义下面的函数(假设C是一些类):

g(bool b) { 
    if (b) { 
     return C(); 
    } 
    return 0.0; 
} 

应该怎样的g返回类型是什么?这可能是double,也可能是C

的语法“必须是这样的”,因为C++是建立在C,它具有几乎没有类型推断。 C++可能已经建立在其他语言之上,在这种情况下,这不是“必须这样做”,但是C++将是一种完全不同的语言。

注意的C++ 0x增加了一个地方的函数返回值类型可以推断:如果lambda表达式体由单个return语句,然后拉姆达的返回类型被推断为是的类型从return语句中的表达式(如果拉姆达是任何其它形式的,返回类型被推断为是void除非显式指定一个返回类型)。因此,下面是相同的:

[]() -> int { return 42; } 
[]() { return 42; } 

Lambda表达式是特殊的,虽然,因为你不能没有定义它宣布一个lambda。

+0

+1:waaah更好的例子:P – 2011-03-13 07:00:08

+0

那么为什么不扩展编译器推导返回类型的函数组成的返回类型的可能性?这在某些情况下会有很大帮助。可能会发生在未来? – rafak 2011-03-30 16:00:50

1

究竟来自同一个原因,你指定类型的函数接收的参数。

此外,假设你没有指定返回值 -

function f(int x) { if (x == 0) return x; else return (x == 0); } 

会是什么˚F回报?

1

C++被设计为strongly typed语言,指定返回值的类型允许编译器验证调用者期望调用函数返回的类型是什么。这个a.o.允许在编译时检测程序中的逻辑错误,而不是在运行时。弱类型编程语言(例如perl)不要求你指定返回类型。每个人都有自己的优势/劣势,您可以在互联网上找到大量信息。

+0

这与“强”与“弱”打字没有任何关系,它与类型推断的可能性有关。你可以有一个“强”类型的语言,其中大部分类型是推断的(例如,F#)。问题在于,在C++中很难或不可能在很多情况下推断类型,因为语言在不同类型(显式类型转换,隐式转换,转换函数,转换构造函数等)之间有很多转换方法。 – 2011-03-13 18:55:32

0

嗯,有几个原因:

  1. C++是“建立在” C,这是它在C.
  2. 的方式,你可以声明函数而不定义它。
  3. 它让编译器为您捕获错误。
1

如果没有返回类型,那么我们就可以不写这个片段的最后一行:

f(int a) 
{ 
    if (a == 0) return 100; 
    else   return "a is not zero"; 
} 

//ambiguous return type 
int a = f(b); // b is known at runtime! 

由于b在运行时是已知的,我们不能决定功能f是否会返回100或字符串a is not zero;如果我们无法确定返回值,那么我们无法决定(并写入)呼叫站点的返回值类型,这意味着我们不能写int a = f(b),因为它也可能是const char* c = f(b)

对于动态类型的语言,这是可能的。但C++不是这样,C++是一种静态类型的语言。这意味着,编译时应该知道每个类型