看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《littleshan (我要加入劍道社!)》之銘言: : void foo(const string& str) : { : // ... : } : void bar() : { : foo("hello world"); : } : 這是合法的 : 但在 foo 裡面 宣告為 refernece 的 str 是誰的別名呢? : 事實上這邊 compiler 會在呼叫 foo() 的地方產生一個 string 暫時變數 : 然後讓 str 成為暫時變數的別名 : 不過這個暫時變數本來就沒有名字了 用「別名」反而很奇怪 : 倒不如說 str 指向一個暫時變數 很高興有討論的機會:) Stroustrup在書中解釋reference的第一句話裡就使用就是"alternative name", 我只是遵照他的意思,因為這也很好會意. compiler在處理呼叫foo()的地方是會產生暫時變數,一定會有個名字, 概略來說, compiler會這麼做: string temp = "hello world"; foo(temp); : 而你在使用 str 時 : compiler 會自動幫你 dereference 同意這句話,C++確實是這麼設計,str是dereference之後的結果,它已經沒有指標的概念了 所以也沒有指向誰的問題,str是temp的另一個名字. 我說明一下我所認為的"指向"誰. int a=1; int *b = &a; //b是一個型態為指標的變數, b的內容就是a的位址,所以b指向a //但是b不是a, a也不是b 另一個片段: int &c = a; //c是a的別名,c可以當成a來看待. //但是不可以把c當指標,c也不是用來指向a的 : 實際上 bar() 在呼叫 foo() 時 : 的確是把暫時變數的位址傳給 foo() : 甚至如果你霸王硬上弓 : 也可以讓 reference 指向 NULL: : string& str = *(string*)NULL; 這句沒看懂,str不是已經宣告過了嗎? : 當然這麼做一點好處也沒有 : 我只是在說明 reference 其實本身就是 pointer : 只是使用的語法不同罷了 這句話認同一半,C++的reference設計概念確實是源於pointer(而且是constant pointer), 只是每當程式在使用時,就被dereference,所以就喪失了pointer的特性. 在進行函式呼叫的時候,什麼時候用pass by reference,什麼時候用pass by pointer, 這就要看當時程式設計時的需求了. -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 128.194.78.48
HZYSoft:簡而言之,兩者概念上不同,但骨子裡可說是完全相同 05/04 13:01
HZYSoft:有人說用 reference 比較安全,其實也不一定 05/04 13:02
HZYSoft:str = *(string*)NULL; 就是個例子,一樣可以參考無效物件 05/04 13:02