c++引用帶來的困擾

        今天突然遇到一個問題,就是一個這樣的問題:

int get_value_a()
{
    int a = 10;
    return a;
}

int gloa = 9;
int& get_value_gloa()
{
    return gloa;
}

        這是最基本的返回普通和引用的區別。但是看似簡單好區分的兩個函數,其本質是怎麼樣的那,又有怎樣的區別。這就是我糾結的地方。如下面的代碼:

int main()
{
    int nvalue1 = 100;
    int nvalue2 = 101;
    nvalue1 = get_value_a();
    nvalue2 = get_value_gloa();
    int& nvalue3 = get_value_a();
    int& nvalue4 = get_value_gloa();
    int& nvalue5 = nvalue1;
 }

        這四種的賦值方式有什麼區別嗎?最終的值是多少呢?

        get_value_a()返回10,然後賦值運算符將10傳給nvalue1,這個幾乎是我們寫代碼中最常用的,一般都是聲明一個變量,然後函數返回一個臨時數值,=將臨時數值賦給此變量。平時都是這麼用,卻也並未多想。但是下一個函數

        get_value_gloa()返回的是一個引用,而一個臨時數值nvalue2 = 一個數gloa的引用,那麼就是nvalue2是不是也變成了gloa引用呢?答案並非如此,nvalue2確實變爲9了,但是當nvalue2++的時候,gloa並未跟着加1。這個賦值操作到底理解爲什麼意義才能最準確那?

        第三句賦值聲明瞭一個引用變量,將函數返回的臨時值給了nvalue3,編譯器直接會告訴我們這是不允許的,其原因是:當將一個臨時變量賦給引用時,引用nvalue3和a的返回拷貝值已經是相同地址的值了,但是a的拷貝在此語句執行完畢之後就會被銷燬,也就是nvalue3也會被銷燬,這是很恐怖的。所以編譯器直接阻止了我們繼續操作。

        第四句就是一個引用變量nvalue4 = 返回的引用,這看起來兩邊是對等的,至少都是引用,賦值才應該是正確的。像是沒有什麼大問題。但是看第五句,引用變量nvalue5 = 普通的數值,兩邊不對等,一個是引用,一個是普通數值,那麼也可以實現引用的效果,那麼這兩者的具體區別是什麼呢?

        當然此問題發散出去,涉及到類之後呢,返回引用的類在賦值的時候又是怎樣的過程呢?


        請教了公司的前輩,大概有了一個方向,就是這些原理是編譯器處理的活,不同編譯器理解這幾句話的方式也不同,這裏就作爲一個坑,後邊好好研究下在填坑。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章