關於C 對函式傳參與函式返回值進行引用傳遞的詳解

2021-05-23 10:56:32 字數 1195 閱讀 9225

關於c++對函式傳參與函式返回值進行引用傳遞的詳解

讀之前,請確定您已經知道引用傳遞是個什麼東東,只是對它有點混淆。沒聽過引用傳遞或沒讀過引用傳遞概念的同學不適合讀本文。

例子程式:

例1.乙個編譯不過去的程式

ok,下面進入正題。如果我想利用fun函式來實現令mycopy1與mycopy2兩個變數共用同一記憶體空間的功能。

例2.乙個達不到目的例子

問題出在,函式傳參時,用的值傳遞,而不是引用。值傳遞會自製出乙個新物件obj,生存期是fun函式執行期間。obj不是我們期待的mycopy2,所以達不到目的。為了讓函式體內的obj就是mycopy2「本體」,我們用引用傳遞。

例3.利用引用傳遞傳參,但仍達不到效果

問題是,怎麼還不行?好吧,您會經常看到這樣的經典用法:

mycopy & fun(mycopy & obj);

為什麼返回值也要用&修飾?我們先來講上例中的函式呼叫原理,這很重要。函式fun被呼叫時,mycopy2的實體在fun內有意義,也就是說obj和mycopy2是共用一塊記憶體的。而return時,複製了乙份mycopy2,返回給了mycopy1。然後由於「=」的作用,這塊複製出的mycopy2按「=」的作用,將自己的成員變數的值賦給了mycopy1。最後mycopy1的記憶體沒有發生變化,只是成員變數的值變了。

例4.讓返回值也是引用傳遞

為什麼還不行?是這樣的,在呼叫fun函式後mycopy2與obj在fun生存期內共用一塊記憶體。返回時由於是按引用傳遞的,這塊記憶體也被返回過來。與上例返回乙個臨時複製的物件不同,這次真的返回了mycopy2的「本體」,可是由於「=」作用,mycopy2成員變數的值被賦給了mycopy1的成員變數,於是mycopy1還是原來的mycopy1。

我們現在有兩個問題:

1、怎麼理解「=」。

2、我想讓mycopy1與mycopy2指向同一塊記憶體應該怎麼做?

解答:1、「=」可以這樣理解mycopy1 = mycopy2;相當於呼叫了函式 mycopy1.=(mycopy2)。看不懂?ok,這些看得懂吧:myobj.a(),myobj.b(),那這個呢myobj.=(),就是乙個名字為「=」的函式。所以函式「=」裡怎麼寫,很重要。這也是過載「=」運算子後,要實現物件複製必需將成員變數一一賦值的原因。

2、ok,要達到目的,可以這樣做mycopy & mycopy2 = mycopy1;當然也有其它方法。

本文編譯環境為ubuntu/g++。

099 函式傳參與它的返回值

變數var store 被宣告為stuff 型別,並且對於其判別式預設為初始化值2。名為var store 的變數還有另乙個屬性,那就是能夠在程式執行期間將其判別式更改為任何合法值。名為data store 和big store 的兩個變數的判別式分別固定為5和12,在程式執行期間不能更改。with...

關於函式傳參及返回值

很多剛學指標的人多會遇到這樣的情況,就是你給乙個函式傳遞乙個指標變數,在這個函式中為這個指標申請空 間,賦值,可是等函式結束後這個指標還是乙個空指標,對其的操作編譯器會報段錯誤或乾脆給你乙個莫名其妙的值,這是乙個隨機數。如 include include int my fun int p int m...

C 函式返回值。

一 params.可變引數,無論有幾個引數,必須出現在引數列表的最後,可以為可變引數直接傳遞乙個對應型別的陣列。class program test msg intarry static void test string msg,params int args 二 ref 引用傳遞 三 out ou...