一、普通資料作為函式引數的和返回值的傳遞方式:
作為函式引數(形參結合):
主調函式呼叫被調函式時,主調函式已經被壓入了執行棧中,首先將要傳遞的引數壓入執行棧的一段特殊區域中(這段記憶體,主調函式和被調函式都可以訪問到),再將被調函式壓入執行棧中(被調函式的形參此時才具有記憶體,且在此時將主調函式的實參賦值給形參)完成了形參結合。
作為函式返回值:
主調函式呼叫被調函式時,被調函式執行結束,返回需要返回的資料時,編譯器先建立乙個臨時的區域性變數,該變數被賦值為需要返回的值,這個變數沒有名字且生存期很短,僅存在於主調函式的表示式中。如:
cout《該句執行完畢,變數生命週期結束。
二、物件作為函式引數
1.作為函式引數:
要傳遞的物件已經存在時:
point a(1,2);
fun1(a);
在執行棧建立乙個臨時物件,將需要傳遞的物件賦值給臨時物件,再將臨時物件賦值給形參。完成形參結合
當要傳遞的物件是臨時建立時:
fun1(point(4,5));
直接將point物件建立在執行棧上,然後將這個物件賦值給形參,完成形參與實參的結合。
2.作為函式返回值:
主流編譯器方法:主調函式建立一段記憶體空間用於存放返回的物件,主調函式呼叫被調函式時,將該記憶體空間作為引數傳入被調函式中(編譯器自動完成,無需程式設計師自己顯性寫出)。因此,返回值所生成的物件的記憶體分配和構造是分步執行的,在主調函式中分配記憶體,在被調函式中進行構造。
比較老的編譯器方法:
將返回值所生成的臨時物件也建立在執行棧的傳參區域(主調函式和被調函式都能訪問的記憶體空間),主調函式在呼叫被調函式時,在執行棧處留下一段記憶體空間,被調函式返回值的時候,往這段空間內存放返回值所生成的臨時物件。
當然,如果主調函式呼叫被調函式採用一下方式:
point p= fun2();
直接在p的記憶體中存放返回的臨時物件即可,無需為臨時物件再建立空間 5 5 2 1 函式作為引數值和返回值
5.5.2.1 函式作為引數值和返回值 在第三章,我們已使用過,在 c 和 f 中把函式作為引數值,因此,這些基本概念不應該是新的 然而,我們還沒有以這種方式使用過 lambda 函式。lambda 函式是把函式寫成另外函式的引數值的最簡單方法。清單 5.17 提供了乙個簡單的示例。在清單中前面的函...
類作為方法引數與返回值
一 類作為方法引數 在編寫程式中,會經常碰到呼叫的方法要接收的是乙個類型別的情況,那麼這時,要向方法中傳入該類的物件。如下 演示 classperson 測試類 publicclasstest 定義乙個方法 method 用來接收乙個 person 物件,在方法中呼叫 person 物件的show方...
函式作為返回值
就像常見的函式一樣,lambda 表示式可以返回乙個函式指標 委託例項 這就意味著我們能夠使用乙個 lambda 表示式來建立並返回另乙個 lambda 表示式。這種行為在很多場景下都是非常有用的。我們先來看下面這個例子 1 func saymyname string language 2 10ca...