雜談 對C 物件的研究

2021-10-21 13:56:10 字數 2142 閱讀 7961

先看這麼一段**

#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,中介軟體內部進行處理之後...