2015-11-13 51 views
0

無法理解C++中的方法簽名。尋找第二個意見。方法簽名C++

readPage(File* file, const PageId pageNo, Page*& page) {}

上面可以被重新寫爲如下?

readPage(File *file, const PageId pageNo, Page *&page) {}

因此,*文件是在和* &頁面中傳遞指針的東西的地址,然後將其轉換爲一個指針?我很困惑與*&

+1

閱讀關於在你最喜歡C引用了++教科書。 'page'的類型是「對'Page'指針的引用」。 –

+0

http://en.cppreference.com/w/cpp/language/reference –

+0

空白在這裏並不重要 - 兩個簽名都是相同的。 – Eugene

回答

0

file的組合是一個指向File,這意味着任何改變它所指向的,像

file->doSomething(); // the caller will see this change 

將被調用可見但是如果覆蓋指針,那麼不僅調用者不會看到指針的新值,而且之後對文件的任何更改也不會被觀察到,因爲它現在是指向不同的File的指針,並且因爲指針本身是按值傳遞的。現在

file = new File(); // the caller will not see this change 
file->doSomething(); // neither will it see this one 

page是一個指針引用一個Page。換句話說,它的行爲就像一個指針,所以

page->doSomething(); // the caller will see this change 

仍然被調用者觀察到。但如果你現在覆蓋指針,調用者的指針也會隨之改變,因此所有連續的變化也可以看出:

page = new Page(); // caller also sees this change 
page->doSomething(); // and this too 

這是因爲指針本身是按引用傳遞,所以指針的任何變化本身由主叫方觀察。

(是的,你只要你把空間都無所謂的樣子,所以這兩種方式是相同的)

+0

我測試這個並理解我需要傳遞一個指向readPage的指針以匹配File *文件,但對於Page *&頁面,我還需要傳入它看起來像的指針。但是一旦傳入,它就不清楚它是如何解釋的。 *&id和* id幾乎類似?在這兩種情況下,它都會評估一個指針。 – tattvabodha

+0

區別與'int'和'int&'之間的區別相似。在這兩種情況下,您都可以傳入一個int變量,但在第二種情況下,調用者可以觀察到對它的所有更改。同樣,在這兩種情況下('file *'和'page *&')你傳遞一個指針,但在後一種情況下,調用者可以看到指針的改變。 – Ishamael

0

頁* &是參考指針指向一個頁面