Re: [語法] about "&"

看板C_and_CPP (C/C++)作者 (okwan)時間18年前 (2006/05/04 07:34), 編輯推噓1(102)
留言3則, 1人參與, 最新討論串2/2 (看更多)
※ 引述《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

05/04 13:01, , 1F
簡而言之,兩者概念上不同,但骨子裡可說是完全相同
05/04 13:01, 1F

05/04 13:02, , 2F
有人說用 reference 比較安全,其實也不一定
05/04 13:02, 2F

05/04 13:02, , 3F
str = *(string*)NULL; 就是個例子,一樣可以參考無效物件
05/04 13:02, 3F
文章代碼(AID): #14MJuIku (C_and_CPP)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
1
3
文章代碼(AID): #14MJuIku (C_and_CPP)