2011-05-09 49 views
1
#include<iostream> 

int & fun(); 
int main() 
{ 
    int p = fun(); 
    std::cout << p; 
    return 0; 
} 

int & fun() 
{ 
    int a=10; 
    return a; 
} 

爲什麼這個程序不會在第6行發出錯誤,將「int *無效轉換爲int」作爲錯誤發生,如果我們這樣做?在C++中的返回類型

int x = 9; 
int a = &x; 
+0

在'int a =&x;'中,'&'表示「地址」,它返回一個指針。你正試圖將一個指向'x'的指針指定爲一個非法的整數。 – Gabe 2011-05-09 03:46:22

+0

我想你只知道C. C++不同於C. int&手段引用,但不包含地址操作符。 &在C++中有多種含義。 – user534498 2011-05-09 03:47:17

回答

5

int&是一種類型;它的意思是「對int的引用」。

&x是一個表達式;它的意思是「採取x的地址。」一元運算符&是地址運算符。它採用其論證的地址。如果xint,則&x的類型是「指向int」(即,int*)的類型。

int&int*是不同的類型。參考文獻和指針在很多方面都是相同的;即它們都是指對象,但它們在使用方式上有很大不同。首先,引用暗指引用對象,並且不需要間接引用到引用對象。顯式間接(使用*->)需要獲取指針引用的對象。

這兩個用途的&是完全不同的。它們不是唯一的用途:例如,還有執行按位和操作的二進制運算符&。也


注意你的函數fun,因爲返回一個引用局部變量是不正確。一旦函數返回,a就會被銷燬並且不再存在,所以你永遠不能使用函數返回的引用。如果您確實使用它,例如通過像這樣將fun()的結果分配給p,行爲是未定義的。

從函數返回引用時,必須確定引用所引用的對象在函數返回後將存在。

0

C++中的函數與宏不相同,即當你qrite int p = fun()它不會變成int p = &a;(我想你就是這個問題)。你正在做的是從函數f返回參考。你沒有考慮任何變量的地址。順便說一句,上面的代碼將調用未經過處理的行爲,因爲您正在返回對局部變量的引用。

1

爲什麼這個程序不會在第5行給出錯誤,因爲「int *無效轉換爲int」,如果我們這樣做的話呢?

這是因爲你試圖通過引用返回變量而不是地址。然而,你的代碼調用未定義的行爲,因爲返回一個引用到本地變量,然後使用結果是UB。

1

因爲在一種情況下它的一個指針,並在其它的參考:

INT A = & X表示設置到x的地址 - 錯

INT & P =樂趣()表示組p指向int - ok

0

您沒有返回int *,那麼您將重新調整int &。也就是說,你要返回一個對整數的引用,而不是指針。該參考可衰減爲int

0

這些是兩個不同的東西,雖然他們都使用&符號。在第一個示例中,您將參考返回給int,該int可指定給int。在你的第二個例子中,你試圖將x(指針)的地址分配給一個int,這是非法的。