#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;
#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;
int&
是一種類型;它的意思是「對int
的引用」。
&x
是一個表達式;它的意思是「採取x
的地址。」一元運算符&
是地址運算符。它採用其論證的地址。如果x
是int
,則&x
的類型是「指向int
」(即,int*
)的類型。
int&
和int*
是不同的類型。參考文獻和指針在很多方面都是相同的;即它們都是指對象,但它們在使用方式上有很大不同。首先,引用暗指引用對象,並且不需要間接引用到引用對象。顯式間接(使用*
或->
)需要獲取指針引用的對象。
這兩個用途的&
是完全不同的。它們不是唯一的用途:例如,還有執行按位和操作的二進制運算符&
。也
注意你的函數fun
,因爲返回一個引用局部變量是不正確。一旦函數返回,a
就會被銷燬並且不再存在,所以你永遠不能使用函數返回的引用。如果您確實使用它,例如通過像這樣將fun()
的結果分配給p
,行爲是未定義的。
從函數返回引用時,必須確定引用所引用的對象在函數返回後將存在。
C++中的函數與宏不相同,即當你qrite int p = fun()
它不會變成int p = &a;
(我想你就是這個問題)。你正在做的是從函數f
返回參考。你沒有考慮任何變量的地址。順便說一句,上面的代碼將調用未經過處理的行爲,因爲您正在返回對局部變量的引用。
爲什麼這個程序不會在第5行給出錯誤,因爲「int *無效轉換爲int」,如果我們這樣做的話呢?
這是因爲你試圖通過引用返回變量而不是地址。然而,你的代碼調用未定義的行爲,因爲返回一個引用到本地變量,然後使用結果是UB。
因爲在一種情況下它的一個指針,並在其它的參考:
INT A = & X表示設置到x的地址 - 錯
INT & P =樂趣()表示組p指向int - ok
您沒有返回int *
,那麼您將重新調整int &
。也就是說,你要返回一個對整數的引用,而不是指針。該參考可衰減爲int
。
這些是兩個不同的東西,雖然他們都使用&符號。在第一個示例中,您將參考返回給int,該int可指定給int。在你的第二個例子中,你試圖將x(指針)的地址分配給一個int,這是非法的。
在'int a =&x;'中,'&'表示「地址」,它返回一個指針。你正試圖將一個指向'x'的指針指定爲一個非法的整數。 – Gabe 2011-05-09 03:46:22
我想你只知道C. C++不同於C. int&手段引用,但不包含地址操作符。 &在C++中有多種含義。 – user534498 2011-05-09 03:47:17