2011-10-01 145 views
2

當我將指針傳遞給變量的引用時,還是獲取指向引用的指針?當我傳遞一個參考引用時,我會得到什麼? 我在一個類中使用standard library的堆棧實現,我想要一些包裝方法來防止非法訪問堆棧,但我得到了奇怪的segfaults,我縮小了我的getter方法,考慮堆棧。傳遞引用的指針/傳遞引用的引用

這些方法應該返回一個乾淨的引用/指向存儲在堆棧中的原始變量的指針嗎?

int& zwei() { return stack.top() }; 

int* eins() { return &stack.top() }; 

回答

3

沒有這樣的東西作爲一個 「指針到參考」。引用是別名,因此採取的任何人的地址會給出一個指向同一個對象:

int a; 
int & b = a; 

assert(&a == &b); 

你的函數都返回提供的stack對象仍然是在功能的範圍還活着一個合法的結果返回。

std::stack<int> s; 

int & foo() { return s.top(); } // OK, maybe 
int * goo() { return &s.top(); } // ditto 

int & boo() { std::stack<int> b; return b.top(); } // No! Dangling reference! 

您也應該檢查堆棧不爲空,在這種情況下top()是無效的。

(我也應該安理會對同名調用一個變量作爲一個類型,即使類型的名字是std::stack。)

+0

什麼叫「好吧,也許」是什麼意思? – Sim

+1

@Sim:他說什麼「好,也許」意味着在這之前:*你的函數都返回一個有效的結果* ** * * * * * * * * * *對象仍然活着。在代碼之後:*您還應該檢查堆棧是否爲空*。這個「提供」和「非空棧」是他的意思是「好吧,也許」。 –

+0

@Sim:'top()'的堆棧不能爲空有效。所寫的代碼不包含對's'的任何插入,所以'foo()'和'goo()'可能* *不可*,並且取決於*你*。另一方面,'boo()'永遠不會。 –