看不懂書中範例 |
答題得分者是:wjhsu
|
theonetw
一般會員 發表:3 回覆:7 積分:2 註冊:2008-06-07 發送簡訊給我 |
請問各位大大,以下是書中的範例,講的是"參考"函式
但是不懂它的意義為何?在函式前加"&"有什麼作用? 而且後來我將函式前的"&"拿掉後重新執行結果還是一樣啊,所以我看不出有沒有加&的差別 請知道的人告訴我一下,感謝 [code cpp] //--------------------------------------------------------------------------- #include #include <math.h><br />#pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; int &fun(int); int y; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { int x=2,a; a=fun(2); Label1->Caption =IntToStr(a); } //--------------------------------------------------------------------------- int &fun(int x) { y=3*pow(x,2)-2*x 1; return (y); } [/code] |
hipig
高階會員 發表:31 回覆:75 積分:111 註冊:2007-01-15 發送簡訊給我 |
|
theonetw
一般會員 發表:3 回覆:7 積分:2 註冊:2008-06-07 發送簡訊給我 |
|
jow
尊榮會員 發表:66 回覆:751 積分:1253 註冊:2002-03-13 發送簡訊給我 |
請先參考這一篇,
http://delphi.ktop.com.tw/board.php?cid=168&fid=1499&tid=91051 何謂Call By Value? Call By Reference? Call By Address? 以下程式碼, 提供你參考... 請觀察一下記憶體配置的位址有何差異? [code cpp] //--------------------------------------------------------------------------- int& TForm1::func(int x) { AnsiString S; int ret = (int)x 1; int &y = ret; ListBox1->Items->Add(S.sprintf("Value of ret = %d",ret)); ListBox1->Items->Add(S.sprintf("Address of ret = %p",&ret)); ListBox1->Items->Add(S.sprintf("Value of y = %d",y)); ListBox1->Items->Add(S.sprintf("Address of y = %p",&y)); return y; } //--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { int &RefA = func(1); int ValA = RefA; AnsiString S; ListBox1->Items->Add(S.sprintf("Value of RefA = %d",RefA)); ListBox1->Items->Add(S.sprintf("Address of RefA = %p",&RefA)); ListBox1->Items->Add(S.sprintf("Value of ValueA = %d",ValA)); ListBox1->Items->Add(S.sprintf("Address of ValueA = %p",&ValA)); } //--------------------------------------------------------------------------- [/code] |
wjhsu
初階會員 發表:9 回覆:32 積分:48 註冊:2004-06-13 發送簡訊給我 |
我覺得, 因為你把y宣告為全域變數, 所以不容易看出它們的區別,
印象中, 對"參考"的解釋簡單地說就是 "把它看成被參考的變數", 另外與其它函式不同的是, 可以將傳回參考的函式放在等號左邊... 1. int fun(int) -->表示將y值計算後, 複製它的值, 然後傳回 2. int &fun(int)-->表示傳回y本身 (前提是因為你的y宣告為全域變數才可) 3. 如果將y宣告在int fun(int)裏, 則結果相同, 但如果宣告在 int &fun(int)裏, 則 compile時就會出錯, 因為函式裏的local 變數在函式結束後就消失了, 所以無法傳回y本身 4. 如果fun()宣告為 int &fun(int), 則下列的敍述是合法的() a = fun(2) ==> 進入fun(2)計算後 y=9, 然後傳回y , 再把y複製給a , 所以 y=9, a=9 fun(2)=101 ==> 進入fun(2)計算後 y=9, 傳回y之後把101複製給y, 所以y最後為101 |
jow
尊榮會員 發表:66 回覆:751 積分:1253 註冊:2002-03-13 發送簡訊給我 |
執行結果(不同電腦,位址會有差異)
Value of ret = 2 Address of ret = 0012F53C Value of y = 2 Address of y = 0012F53C Value of RefA = 2 Address of RefA = 0012F53C Value of ValueA = 2 Address of ValueA = 0012F58C 動作說明: (1)int ret = (int)x 1; (int)x 1 運算後, 返回值放置在新配置的 int 變數 ret 中. 此時, ret 在記憶體中佔據 4bytes空間, 並有內含值(此例為 2) (2)int &y = ret; y 被宣告成 變數 ret 的參考, 在程式中雖然有不同變數名稱 其實 y 與 ret 佔有同一個記憶體空間, 當然有相同內含值. (3)int &RefA = func(1); RefA 也是宣告為某 int 變數的參考, 此例中用來承接 func()傳迴值 在記憶體所在的參考, 因此 RefA 如同 y 一樣, 同為 ret 的一個參考 佔有同一個記憶體空間, 當然有相同內含值. (4)int ValA = RefA; ValA 是一個新宣告的變數, 因此佔據不同的記憶體位址, 此例中用來 承接 RefA 的內含值. (5)若 func() 中改為 int &y = (int)x 1; 則 y 所參考的是不具變數名稱的一個記憶體位址... 個人見解,謹供參考.... |
theonetw
一般會員 發表:3 回覆:7 積分:2 註冊:2008-06-07 發送簡訊給我 |
感謝您的教導~~~
===================引 用 wjhsu 文 章=================== 我覺得, 因為你把y宣告為全域變數, 所以不容易看出它們的區別, 印象中, 對"參考"的解釋簡單地說就是 "把它看成被參考的變數", 另外與其它函式不同的是, 可以將傳回參考的函式放在等號左邊... 1. int fun(int) -->表示將y值計算後, 複製它的值, 然後傳回 2. int &fun(int)-->表示傳回y本身 (前提是因為你的y宣告為全域變數才可) 3. 如果將y宣告在int fun(int)裏, 則結果相同, 但如果宣告在 int &fun(int)裏, 則 compile時就會出錯, 因為函式裏的local 變數在函式結束後就消失了, 所以無法傳回y本身 4. 如果fun()宣告為 int &fun(int), 則下列的敍述是合法的() a = fun(2) ==> 進入fun(2)計算後 y=9, 然後傳回y , 再把y複製給a , 所以 y=9, a=9 fun(2)=101 ==> 進入fun(2)計算後 y=9, 傳回y之後把101複製給y, 所以y最後為101 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |