-
不要返回臨時變數的位址或引用。
當函式呼叫結束時,堆疊將被清除,臨時變數將被銷毀,因此返回的內容無效。
函式的返回值是 3,一開始會儲存在 eax 暫存器中,但是當再次呼叫函式時,eax 的值會被清除,所以它不是 3,但是如果改成變數儲存,肯定沒問題(但這個 ** 是不可接受的)。
-
函式有自己的堆疊,函式作用域中的臨時變數在函式結束後釋放。
返回對臨時變數的引用是不安全的,因為記憶體已被釋放。
-
樓上的夫妻倆說,基本細節是返回引用的意思,也就是返回值就是乙個引用。 你的老師錯了。
返回引用是對已存在的物件的引用(請記住,它必須已經存在)。
教科書對引用這種資料型別非常簡單,甚至將其用作變數的“別名”可能是多餘的!
事實上,它確實在引數傳遞中發揮作用!
眾所周知,在C語言中,無論是從實際引數到形式引數,還是從區域性變數到返回值,都是值轉移。
想象一下,你要去月球,現在從你的身體裡拿出乙個細胞,轉殖出像你這樣的人,讓它完成你的月球探測計畫,然後回來告訴你它的感受,也許你可以聽聽它,它的成功證書可以被你取代,但這是你想要的嗎?
t fun(t t) void main()
你能在上面的**中找到多少個變數?
1.區域性變數 t 在主函式 main() 中定義。
2.當呼叫 fun() 函式時,會自動生成乙個區域性變數(即參數列中的變數 t)以接受引數的值。
3.當 fun() 函式返回自己的引數變數 t 時,它會自動生成乙個匿名臨時變數來儲存返回值。
t& fun(t& t) void main()
與上面的**相比,沒有第 2 和第 3 個變數。
引文的使用在以下情況下很常見:(非常不完整,扔磚頭和石頭)。
場景 1:返回函式引數 t& fun(t&t)。
場景 2:返回靜態變數 t& fun()。
場景 3:返回當前物件 t& t::fun()。
場景 4:返回新物件 t& fun()。
請注意,與上一種情況類似但不等效的指標採用以下形式:
t&fun() 物件 (*pt) 不會被釋放,除非顯式呼叫 delete!
-
返回引用表示返回變數本身,它可以是左值。
-
C++中函式的返回分為以下幾種情況:
1)返回非引用型別:函式的返回值用於初始化函式跳轉時建立的臨時物件。使用函式返回值初始化臨時物件與使用實際引數初始化表單引數相同。
如果返回型別不是引用,則返回值將被複製到函式返回的臨時物件中。 返回值可以是本地物件,也可以是表示式的結果。
2)返回引用:當函式返回引用型別時,它不會複製返回值,而是返回對物件(即物件本身)的引用。
函式返回引用:實際上是乙個變數的記憶體位址,既然是記憶體位址,那麼它一定能夠讀寫與該位址對應的記憶體區域的值,即“左值”,可以出現在賦值語句的左側。
》當函式返回引用時,可以使用全域性變數(作為函式返回),或者函式的參數列中有引用或指標(作為函式返回),這有乙個共同點,那就是執行返回後,變數仍然存在,那麼返回的引用就有意義了。
摘要: (1) 使用引用作為函式引數和返回值更有效。
2)函式返回的物件引用在呼叫函式之前必須已經存在,不允許引用區域性變數!
3)當你不想修改返回的物件時,你可以新增const。
-
通常的返回機制將返回值複製到臨時儲存區域,然後由呼叫方訪問該區域。
如果返回引用,程式將直接訪問呼叫方的返回值。
通常,引用將指向傳遞給函式的引用,因此呼叫函式實際上是直接訪問它自己的變數之一。
例如,const int&fun (int&a, const int&b)。
int x = 1, y = 2, z;
z = fun(x, y);
等價於 fun(x, y); z = x;
而且返回引用不能在函式內部返回乙個臨時變數,因為變數是隨著函式的結束而銷毀的,返回值將毫無意義,比如。
const int& fun (int& a, const int& b)
程式崩潰是因為變數 c 在程式結束時被銷毀,並且返回的與 c 同名的物件毫無意義。
-
如果返回乙個值,那麼記憶體中只有兩個單元來儲存整形資料,乙個是函式中生成的整形資料,另乙個是接收到後的整形資料,返回引用只需要乙個單元格來儲存整形資料,返回和接收的都是相同的整形資料。
-
1.這是當您返回對區域性變數(包括引數)的引用時。
是乙個 int 型別,auto 在 C++ 中是已棄用的關鍵字,但在 C++11 中重新啟用以自動派生型別。 e 是乙個引用型別,即可以想象成就是被引用的物件,所以當你取 e 的位址時,你實際上得到了被引用物件的位址。 由於你的 e 引用了乙個區域性變數,該變數是堆疊上的乙個變數,因此你會得到不同的結果,因為堆疊的起始位址通常會隨機變化。
隨機更改的原因是為了防止某些型別的攻擊並提高程式的安全性。
static 中沒有靜態型別,靜態型別用於表示變數的生命週期型別,即靜態生命週期。 我想你是想說 b 是靜態的
int。靜態時
int,程式在啟動時會將 B 初始化為 40,並且會一直持續到程式結束,因此此時返回引用是有效的,因為編譯器保證變數生存期將持續整個程式持續時間。
e2 = f();這將返回乙個引用,而 e2 不是引用,因此複製初始化已經完成,因此 e2 和 f() 返回的引用是兩個物件。 E2 為 40。
f()=10;這裡是因為返回乙個指向靜態的引用
intb,所以 B 被修改,所以 B 變為 10。
e2 是 main 的區域性變數,e 是引用,f() 返回值是引用,在這種情況下,e 等價於 f()。 取乙個位址時,e2 的位址不會等於 e 的位址,因為它們是兩個物件,兩個物件的位址必然不同(乙個類的子物件除外)。 這裡 e2 是乙個區域性變數,在堆疊上分配,而 e,f() 指向乙個靜態變數,因此在全域性記憶體中分配。
-
1+2 是的,我覺得你說的“鏈應用”有點誇張,就是連續使用運算符號,比如你用加法運算子返回乙個類型別資料,但是加法後你用了你想用的類的成員x,如果不加引號的話, 它是 a=b+c;,但如果你引用它,你可以 (B+C)。x,只是因為如果你只是返回乙個值,那麼它只會在堆疊中開啟乙個資料位址來儲存零小時物件的值,然後用複製建構函式將這個臨時物件的值複製到 B 上,但是你不能使用它,而是引用是傳遞位址以便你可以使用它, 有乙個例子非常清楚地說明了這種差異:a=3,如果我用3+1,這裡的3在b+c的情況下顯然是沒有意義的;但是當我用a+1的時候,我用的是意義,a是3的位址的引用,你用意義改變它下面的值,我只能說這麼多,有些事情要自己想;
3、更簡單一點,++a,如果你引用是返回a的位址,此時a加了1,完全沒問題,但如果是a++,你返回a加1前面的值,換句話說,a此時不是a,而是a+1,但是如果你引用,那麼就是它的位址, 而且位址是 a + 1,那麼後面的 ++ 和第乙個 ++ 沒什麼區別,這樣做沒有意義,你能理解嗎?
4、去當然有用,就看你怎麼用了,引用不是強行用的,而是要看你想實現什麼功能,以++為例,定義函式的時候,一定要啟動位址,但是如果你返回值而不是傳遞引用, 那麼你想讓(++A)++有意義嗎?顯然,不,應該是括號裡的++a是乙個常數,和3+1一樣;
5.看完上面的東西,如果你明白了,這個問題不是問題,它仍然是乙個解決的問題。
-
k = 1, m = 2
1. int &r = func(k,m );這裡 r 接收對返回值的引用。
2.func 函式返回 m,它是函式的乙個靜態區域性變數(函式結束時不會釋放),所以 func 之外的 r++ 也會修改 func 中的 m
讓我們來看看這個過程:
1. k = 1, m = 2
2. int &r = func(k, m);
3. i = 2 + m + 1 = 3;
4. m = i + a + b = 3 + 1 + 2 = 6;
5. r = 6;指向 mu
6.Cout:“應該理解這個過程的其餘部分。
-
引用變數的本體等價物。
如果引用發生變化,本體也會發生變化,即 main 函式中的 r 等價於 main 函式之外的 m(即 6)。
main 中的 m 是 2。
r++ 是 m++,然後變成 7
一般來說,在外面看 r 是 M
-
0;第乙個返回返回。 以下語句將不執行。
-
這相當於布林值,程式的正常執行返回 1
遞迴實際上是“函式的自我呼叫”。
在這個“自呼叫”過程中,必須有乙個變化的“引數”,當這個“引數”達到你想要的值時,“自呼叫”過程就終止了。 >>>More