C 返回區域性物件

2021-06-01 09:41:56 字數 1630 閱讀 4570

引用 看做乙個靜態的指標 const 指標

引用是c++中的概念,引用既不是變數的拷貝,也不是指向變數的指標;

相對於指標:

引用被建立同時必須被初始化;

不能有null引用,必須與合法儲存單元關聯;

引用被初始化,引用關係就不能改變;

我的理解是引用是編譯器產生的變數表中變數的乙個名字,類似於表中這個變數的索引的乙個東西;

有人這樣說:

程式在編譯時分別將指標和引用新增到符號表上,符號表上記錄的是變數名及變數所對應位址。指標變數在符號表上對應的位址值為指標變數的位址值,而引用在符號表上對應的位址值為引用物件的位址值。符號表生成後就不會再改,因此指標可以改變其指向的物件(指標變數中的值可以改),而引用物件則不能修改。

引用的位址概念;

指標指向一塊記憶體,它的內容是所指記憶體的位址;而引用則是某塊記憶體的別名。

區域性物件也可以返回

因為c++中使用臨時複製物件來傳值的緣故.例如: 區域性string str 物件,return str;時c++會用乙個臨時複製物件來儲存str的值,接著str的生存期結束,然後臨時物件的值被賦給呼叫處,最後臨時複製物件的生存期結束,通過彙編**會看到返回的時候會再構造乙個物件,最後析構2次,但是第二次析構的時候臨時物件已經複製到呼叫處了。

004518e8  call        dword ptr [__imp_std::basic_string,std::allocator>::basic_string,std::allocator> (47e7f0h)]

004518ee  cmp         esi,esp

004518f0  call        @ilt+4760(__rtc_checkesp) (42529dh)

004518f5  mov         ecx,dword ptr [ebp-118h]

004518fb  or          ecx,1

004518fe  mov         dword ptr [ebp-118h],ecx

00451904  mov         byte ptr [ebp-4],1

00451908  mov         esi,esp

0045190a  lea         ecx,[ebp-4ch]

0045190d  call        dword ptr [__imp_std::basic_string,std::allocator>::~basic_string,std::allocator> (47e7cch)]

00451913  cmp         esi,esp

00451915  call        @ilt+4760(__rtc_checkesp) (42529dh)

0045191a  mov         byte ptr [ebp-4],0

0045191e  mov         esi,esp

00451920  lea         ecx,[ebp+0ch]

00451923  call        dword ptr [__imp_std::basic_string,std::allocator>::~basic_string,std::allocator>(47e79ch)]

c 返回函式區域性物件的引用

在上面的 中,最後能夠輸出正確的值,然而在函式getnode 中,str是乙個區域性的物件,記憶體空間在棧上,當函式退出時,str的記憶體空間被 這是在高階語言的層面上講的。但是為什麼最後的結果是正確的?原因就是node newnode getnode 這句呼叫的是預設的拷貝建構函式,如果是自己重新...

c 返回函式區域性物件的引用

函式千萬不要返回區域性物件的引用或指標 區域性變數在函式裡面,當函式執行結束後將釋放區域性變數,如果返回引用或批針這個時候引用或指標指向所指向的記憶體空間已經釋放。指標和引用將是垂懸指標。很危險!但是如果返回的 區域性變數 是堆中的記憶體值就可以返回了 c 函式為什麼要使用引用?c語言之中大量利用指...

C 之全域性物件,區域性物件,靜態區域性物件

先說兩個概念 作用域 scope 和生命週期 lifetime 作用域 名字的作用域指的是知道該名字的程式文字區域 生命週期 物件的生命週期指在程式執行過程中物件存在的時間 全域性物件,顧名思義是全域性的物件,其作用域是整個程式文字,其物件的宣告週期是整個程式的執行過程 區域性物件 一般說的區域性變...