物件作為函式引數

2021-10-12 03:10:49 字數 1067 閱讀 5456

物件作為函式的引數時,其傳遞過程較為複雜,傳遞方式比較獨特。其傳參過程與陣列不同:陣列變數的名稱代表陣列的首位址,而物件的變數名稱卻不能代表物件的首位址。傳參時不會像陣列那樣以首位址作為函式的引數傳遞,而是先將物件中的所有資料進行備份(複製),將複製的資料作為形參傳遞到呼叫函式中去、

類物件中的資料成員的傳參順序為:最先定義的資料成員最後壓棧,最後定義的資料成員最先壓棧

但是當物件裡面 申請堆空間的時候,使用傳參且淺拷貝,它只把堆空間位址傳過去,拷貝到形參中去

我們從位址40122c可以看出mov eax ,dword [ebp-10h],這句話的意思是把引數的值,也就是堆空間的位址作為引數直接傳給形參物件,然後開闢的堆空間卻是同一塊地方。

注意和lea ecx , [ebp-10h]不一樣,這裡的ecx指的是物件的位址,並非堆空間的位址,堆空間的位址是 物件的值,這條指令執行的是把物件的位址(即this指標)作為形參傳給建構函式,然後建構函式進行一系列的初始化。

這裡有一句m_pspring位址並非main函式中的物件mystring的首位址

解釋一下m_pspring位址也就是mystring的值,[ebp+8]也就是上面位址40122f所傳進來的eax(呼叫函式push進來的第乙個引數),[ebp+4]這裡是上個函式的返回位址,位址4010e4這裡lea ecx [ebp+8]取的是堆指標的位址,把堆指標的位址作為引數傳給getstring函式,然後進行操作。

這裡兩次釋放堆空間,第一次釋放是呼叫完showstring函式後進行了堆的釋放(也就是**(位址4010f2或者401235)****結束後),第二次釋放是main函式(位址4010ff或者401242)**結束後

類物件作為函式引數

網上看見一段 是關於類物件作為函式的引數,其中有幾點知識,貼出來大家一起學習。直接來看 include include using namespace std class people people people char namestr,int i people people char peopl...

物件作為引數

在這個例子中,我們將isequal 功能是價值流的乙個朋友。isequal 取兩個值物件作為引數。因為isequal 是價值類的朋友,它可以訪問所有的值物件的私有成員。在這種情況下,它使用的訪問在兩個物件做乙個比較,並返回true,如果他們是平等的。乙個函式可以同時對多個類的乙個朋友。例如,考慮下面...

Python之函式物件作為引數

秉承著一切皆物件的理念,我們再次回頭來看函式 function 函式也是乙個物件,具有屬性 可以使用dir 查詢 作為物件,它還可以賦值給其它物件名,或者作為引數傳遞。函式可以作為乙個物件,進行引數傳遞。函式名 比如func 即該物件。比如說 def test f,a,b print test pr...