C++ 功能';s返回类型';需要

C++ 功能';s返回类型';需要,c++,C++,//我们总是指定函数的返回类型,因为它在语法中…..但是有谁能告诉我,通过指定函数的返回类型,我们的基本目标是什么…..这意味着为什么语法必须这样做…..可能是我们可以只返回值..您必须在函数声明,因为并非所有函数声明都是定义。例如,如果不需要返回类型,可以考虑下面的声明: f(int x); f(42)的类型是什么?无法从该声明中得知,因此需要指定返回类型 或者,考虑以下函数的定义(假设 c>代码>是某个类): g的返回类型应该是什么?它可以是double,也可以是C 必须是这样的,因为C+

//我们总是指定函数的返回类型,因为它在语法中…..但是有谁能告诉我,通过指定函数的返回类型,我们的基本目标是什么…..这意味着为什么语法必须这样做…..可能是我们可以只返回值..

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

f(int x);
f(42)
的类型是什么?无法从该声明中得知,因此需要指定返回类型

或者,考虑以下函数的定义(假设<代码> c>代码>是某个类):

g
的返回类型应该是什么?它可以是
double
,也可以是
C

<语法>必须是这样的,因为C++是建立在C上的,实际上没有类型推断。C++可以建立在其他语言之上,在这种情况下,这不是“必须这样做”,而是C++是一种完全不同的语言。 请注意,C++0x添加了一个可以推断函数返回类型的位置:如果lambda表达式体由单个
return
语句组成,则lambda的返回类型将推断为
return
语句中表达式的类型(如果lambda是任何其他形式,除非明确指定了返回类型,否则返回类型推断为
void
)。因此,以下内容是相同的:

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

但是,Lambda表达式是特殊的,因为如果不定义Lambda,就不能声明它。

正是出于同样的原因,您指定了函数接收的参数类型

另外,假设您没有指定返回值--


f将返回什么?

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

好吧,有几个原因:

  • C++是“建立在”C之上的,这就是C中的方式。
  • 您可以在不定义函数的情况下声明函数。
  • 它让编译器为您捕获错误。

  • 如果没有返回类型,则无法写入此代码段的最后一行:

    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不是零
    ;如果我们无法确定返回值,则无法确定(并写入)调用站点的返回值类型,这意味着我们无法写入
    int a=f(b)
    因为它也可以是
    const char*c=f(b)


    <>动态类型语言,但C++不是静态类型语言。这意味着每种类型都应该在编译时知道。

    如果函数没有指定,则假定函数返回“代码> int <代码>。这与“C++”与“弱”无关。键入,它与类型推断的可能性有关。可以有一个“强”类型的语言,其中大多数类型都被推断出来(例如,f)。问题是C++在很多情况下很难或不可能推断类型,因为语言有很多种在不同类型之间转换的方式。(显式转换、隐式转换、转换函数、转换构造函数等)。那么,为什么不扩展编译器推断由单个返回语句组成的函数的返回类型的可能性,就像lambda一样?这在某些情况下会有很大帮助。将来会发生吗?
    function f( int x ) { if (x == 0) return x; else return (x == 0); }
    
    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!