先看這麼一段**
#include
using
namespace std;
static
int times =0;
class
test
~test()
private
:int id;
}int
main()
這段**的執行結果是
create 0
create 1
finish
destroy 0
destroy 0
這狠狠**驚到了我:
我建立了兩個物件,結果乙個物件並沒有被銷毀,另乙個物件被銷毀了兩次
這太奇怪了
我本來想**的是c++的自動銷毀過程,如果乙個物件沒有被使用是否就會被自動銷毀
在和學長討論之後,我發現了,其實這段**的執行結果是正確的
我們加上兩行**就可以看的很清楚了:
int
main()
執行的結果是:
create 0
create 1
0x7fff504d97f0 0x7fff504d97f4
0x7fff504d97f0 0x7fff504d97f4
finish
destroy 0
destroy 0
在test2=test1
的前後,test2
的位址始終沒有變,說明它仍然是它
那麼,究竟是為什麼呢
原來,這裡的=
的意思是複製拷貝,把test1的資料拷貝到test2裡面,但是,test2原來的物件並沒有被遺棄,而是被覆蓋了
改寫=
運算,能看的更清楚
public
:auto
operator=(
const test& test)
執行結果:
create 0
create 1
0x7fff504d97f0 0x7fff504d97f4
0x7fff504d97f0 0x7fff504d97f4
finish
destroy 0
destroy 1
寫到這裡,我不禁對c++的類產生了疑惑,因此,我使用readelf
對產生的可執行檔案進行了處理
使用命令:readelf -a a.out | grep test
輸出結果:
58
:0000000000001470
78 func weak default 16 _zn4testd2ev
62:0000000000001400
112 func weak default 16 _zn4testc2ev
63:00000000000014be 39 func weak default 16 _zn4testaserks_
72:0000000000001400
112 func weak default 16 _zn4testc1ev
79:0000000000001470
78 func weak default 16 _zn4testd1ev
豁然開朗,原來c++中的類也只不過是對一些函式進行管理而已
使用gdb,我解析出了上面的函式的對應關係:
_zn4testd2ev test::~test()
_zn4testc2ev test::test()
_zn4testaserks_ test::operator=(test const&)
_zn4testd1ev test::~test()
_zn4testc1ev test::test()
繼續解析main函式,根據其彙編**,雖然長了點,但是,其實還是只不過是在合適的地方呼叫合適的函式而已,而至於在**應當呼叫什麼函式,那就是編譯器的自由了 雜談 繼承的研究(一)
我已經學到的繼承是這麼回事 派生類擁有父類的所有變數和方法 因為還沒有看c 深入理解物件模型或者之類的這種書,我也不想直接查資料,因此準備自己寫幾行 進行實驗 現在我有這幾個疑問 當父類與子類變數同名的時候,怎麼進行區分 當父類與子類函式同名的時候,怎麼進行處理 當父類與子類函式和變數同名的時候,怎...
C 物件導向以及STL雜談
繼承多型 動態多型 模板stl 關聯容器 封裝是什麼 隱藏物件的屬性和實現細節,僅對外公開介面和物件進行互動,將資料和運算元據的方法進行有機結合 c 語言中,強化了c語言的封裝特性,對內開放資料,對外遮蔽資料 提供介面 函式是封裝的一種形式 函式所執行的細節行為被封裝在函式本身這個更大的實體中,被封...
對redux saga的研究
中介軟體用過redux thunk,也用過redux promise middleware,原理都很簡單。thunk就是簡單的action作為函式,在action進行非同步操作,發出新的action。而promise只是在action中的payload作為乙個promise,中介軟體內部進行處理之後...