C++引用與變數名的區別

來源:互聯網
上載者:User
1.

string Fun1()

{
      string num="ly";
  return num;
}
//在程式中使用此方法不會報錯,因為方法執行完畢以後雖然num被釋放,但是num的值會被儲存到一個臨時儲存單元,然後從臨時儲存單元複製到調用此方法給其賦值的變數中去(如:在main方法中:string mynum=Fun1(),num的值就會被儲存到mynum)

2.

string& Fun2()

{
  string num="ly";
  return num;
}

//在程式中使用此方法會報錯,因為返回的是對num的引用,而Fun2()方法執行完畢以後num被釋放了,所以返回的引用試圖引用已經被釋放的記憶體會報錯

 

 

後來研究發現,將以上兩個例子中的string類型換做int類型,都不會報錯。既:

#include <iostream>
#include <string>
using namespace std;

int& Fun1()
{
int num=123;
return num;
}
int main()
{
  int mynum=Fun1();//運行到這一句居然不報錯,為什嗎?難道Fun1中的局部變數num沒有被釋放?
  cout<<mynum<<endl;  
  return 0;

 

 

如果將int類型換為int指標類型,又會報錯:

#include <iostream>
#include <string>
using namespace std;

int*& Fun1()
{
    int num=456;
    int *p=&num;
    return p;
}
int main()
{
    int* p=Fun1();//運行到這一句居然不報錯,為什嗎?難道Fun1中的局部變數num沒有被釋放?
    cout << "result:\n";//在對指標p取值之前,必須任意調用一個方法,以產生參數壓棧或局部變數申請記憶體操作,好覆蓋Fun1方法中的具備變數num
    cout<<*p<<endl;  //輸出一個錯誤的值
    return 0;
}

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.