2011-03-13 198 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++是一種靜態類型的語言。這意味着,編譯時應該知道每個類型