2016-05-13 132 views
2

在下面的代碼中,爲什麼返回的指針p被允許改變?如果f代替返回「const int *」,那麼編譯器會在行「int * p = f()」處抱怨類型不匹配錯誤。爲什麼它對「int * const」做同樣的事情?從函數返回「int * const」

btw:我知道代碼中有內存泄漏,但這與問題無關。

int * const f() { 
    return new int(23); 
} 
int main(){ 
    int * p=f(); 
    p= new int(35); 
    return 0; 
} 
+1

非常相關:http://stackoverflow.com/questions/1143262/what-is-the-difference-between-const-int-const-int-const-and-int-const –

回答

3

因爲你正在返回一個不可修改的指針 - 指針不可修改的數據。

是的,返回的指針是不可修改的 - 但它永遠不會被修改!您正在修改不同的指針,p - 它剛剛與您的不可修改的(和未命名的)指針的值相同 - 現在這個指針已經消失 - 只要語句完成,該對象就是一個臨時的並且被遺忘的指針。

這就是爲什麼通過函數中的值返回const限定的簡單類型沒有意義並且實際上在某些編譯器中觸發警告的原因。

+0

這是真的。你應該使用'int const *'而不是'int * const'。 – lolski

+0

此外,'int const * const'將聲明一個指針,它在指向的位置以及該位置的實際值都是常量 – lolski

0

在下面的代碼中,爲什麼返回的指針p被允許改變?

因爲p的類型是int *。由於指針不是const,所以可能會被修改。如果你想p不被修改,那麼你就必須爲const:int * const p

如果f而是返回「const int的*」,那麼編譯器會抱怨在行「詮釋* p型失配誤差= f()「

指針到const不能轉換爲指向非const的指針。語言不允許這樣的轉換,因爲它會破壞const的正確性。

爲什麼它對「int * const」做同樣的事情?

我想你的意思是問:「爲什麼編譯器允許將int * const分配給int *變量?」

將const對象複製到非const對象不會破壞const正確性。當p爲非常量時,可以對其進行修改,並且f返回的常量臨時值在整個(短)生命週期內都保持不變。

臨時性的穩定性很少有意義,因此返回頂級常量值。

0

*const是一個常量指針,而const *是一個指向常量的指針。後者是不變的價值;你當然可以把這個值賦給一個變量,就像你會寫int x = 42;一樣。前者指向一個不可變的對象,因此將其分配給一個應該指向可變對象的變量可能會違反該對象的常量。