C 類的物件作為函式引數和返回值的傳遞方式

2021-08-26 23:59:18 字數 1002 閱讀 9329

一、普通資料作為函式引數的和返回值的傳遞方式:

作為函式引數(形參結合):

主調函式呼叫被調函式時,主調函式已經被壓入了執行棧中,首先將要傳遞的引數壓入執行棧的一段特殊區域中(這段記憶體,主調函式和被調函式都可以訪問到),再將被調函式壓入執行棧中(被調函式的形參此時才具有記憶體,且在此時將主調函式的實參賦值給形參)完成了形參結合。

作為函式返回值:

主調函式呼叫被調函式時,被調函式執行結束,返回需要返回的資料時,編譯器先建立乙個臨時的區域性變數,該變數被賦值為需要返回的值,這個變數沒有名字且生存期很短,僅存在於主調函式的表示式中。如:

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...