Re: [語法] about "&"
※ 引述《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
05/04 13:02, 2F
→
05/04 13:02, , 3F
05/04 13:02, 3F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章