对象作为函数参数
對象作為函數(shù)的參數(shù)時,其傳遞過程較為復(fù)雜,傳遞方式比較獨特。其傳參過程與數(shù)組不同:數(shù)組變量的名稱代表數(shù)組的首地址,而對象的變量名稱卻不能代表對象的首地址。傳參時不會像數(shù)組那樣以首地址作為函數(shù)的參數(shù)傳遞,而是先將對象中的所有數(shù)據(jù)進(jìn)行備份(復(fù)制),將復(fù)制的數(shù)據(jù)作為形參傳遞到調(diào)用函數(shù)中去、
這里就詳細(xì)講講還有堆空間的對象淺拷貝就行,其它的可以評論區(qū)討論討論
類對象中的數(shù)據(jù)成員的傳參順序為:最先定義的數(shù)據(jù)成員最后壓棧,最后定義的數(shù)據(jù)成員最先壓棧
但是當(dāng)對象里面 申請堆空間的時候,使用 傳參且淺拷貝,它只把堆空間地址傳過去,拷貝到形參中去,
我們從地址40122C可以看出mov eax ,dword [ebp-10h],這句話的意思是把參數(shù)的值,也就是堆空間的地址作為參數(shù)直接傳給形參對象,然后開辟的堆空間卻是同一塊地方。
注意和lea ecx , [ebp-10h]不一樣,這里的ecx指的是對象的地址,并非堆空間的地址,堆空間的地址是 對象的值,這條指令執(zhí)行的是把對象的地址(即this指針)作為形參傳給構(gòu)造函數(shù),然后構(gòu)造函數(shù)進(jìn)行一系列的初始化。
這里舉個例子給大家理解理解什么對象的地址,什么是堆的地址(即m_pSpring一個指針)。
假如:依據(jù)題意數(shù)據(jù) 為以下數(shù)據(jù)
(MyString的首地址)對象的地址:0x1234(此地址值存在占空間作為參數(shù)傳遞)
對象的值(也就是m_pSpring的地址):0x5566 (即 [ebp-10h])
(m_pSpring的地址)堆指針的地址:0x5566
(m_pSpring的值) 堆指針的值:0x4567(這里指向了所new出來的堆空間)
這里有一句m_pSpring地址并非main函數(shù)中的對象MyString的首地址
解釋一下 m_pSpring地址也就是MyString的值,[ebp+8]也就是上面地址40122F所傳進(jìn)來的eax(調(diào)用函數(shù)push進(jìn)來的第一個參數(shù)),[ebp+4]這里是上個函數(shù)的返回地址,地址4010E4這里lea ecx [ebp+8]取的是堆指針的地址,把堆指針的地址作為參數(shù)傳給getString函數(shù),然后進(jìn)行操作。
這里兩次釋放堆空間,第一次釋放是調(diào)用完ShowString函數(shù)后進(jìn)行了堆的釋放(也就是**(地址4010F2或者401235)代碼**結(jié)束后),第二次釋放是main函數(shù)(地址4010FF或者401242)代碼結(jié)束后
總結(jié)
- 上一篇: c++对象长度之静态数据成员(3)
- 下一篇: 返回对象1(未调用拷贝构造函数)