關於構造和析構的幾點擬人化思考

2022-03-20 15:38:52 字數 2270 閱讀 2669

zephyr

1304

學而不思則罔,思而不學則殆,

最近對effectivec++

等書的複習,

發現體悟良多,

溫故可以知新,古人誠不我欺。

也是,designpattern

、c++

底層等,

在沒有長期使用和大型系統的經歷前,

往日都是小和尚念經,有口無心,

如inside c++object

所言 「

不要靠猜,不要等大師來解決

」想要高階,

刨根問底,極致主義精神是必不可少的,

程式各個模組的生命週期了然於胸,

它們何時出生何時離去,它們到底做了什麼?

這似乎是最簡單的構造,析構函式,

但慚愧地發現自己亦有不甚透徹的點,

偶然看到一些象徵的方式似乎很利於體悟,

為求之甚解,從最開始的地方開始,

略做總結一二:

1,如果說乙個物件,相當於乙個人,

那建構函式

,就相當於他的出生,人的基本出生狀況(生理條件,

component

)都是一樣的,

所以,可以有多個建構函式的

過載,但是基本的條件都是一樣「

一無所有

」的(資料初始化、指標設

null

);

2,人有生,亦有死,想到這些,我們不必悵然,反而應該豁達,因為無論在漫漫人生路上我們獲得了什麼,最後也是一無所有的走的,尤其是賺到的金錢財富,享有的物質,民政部一定會把你登出戶頭(析構,必須清理掉所有的資料,尤其是申請的

堆記憶體,並銷毀指標設

null

),什麼也帶不到天國的(要不就是

memleak

);

3,話雖如此,人人生來在時間生命上自由平等,但是畢竟家庭,環境不同(有不同的

建構函式

),生來的貴賤貧富之分是在所難免的,但是王侯將相,寧有種乎?難道人的所有就只在出生一刻決定了麼?!(構造時),不,還是有逆襲的機會的,所以,除了第一點提到的一無所有,所有的由

外部引數

決定的屬性構造,我們都應將其獨立地

抽出為方法,如

iniitems,inimoney

,以待不日之需;

4,乙個人絕無可能使自己出生,但是悲傷的情緒還是會無情地將人打敗,他有自殺的能力(物件不可以顯式呼叫

建構函式

,但是可以呼叫

析構函式

),而且,考慮到有時候並非自殺,而是可能掉落峽谷,脫胎換骨,所以析構函式我們也應抽出為單獨的方法,如

cleanup

money

,cleanupitems

,inimoney

可能只需要往上加錢就行(除非從高帥富墜落人間,

clean

成破產),但是

iniitems

很可能會需要將原先的屬性清除(

iniitems

先需要cleanupitems

);

5,正好展開來,物件指標和物件資料指標二者一定要清晰地分離,咋一看很簡單,但現實往往卻容易混淆,如高帥富墜落後因為由奢入簡難而刷爆

n張信用卡,然後就去

delete

自己,這不科學吧?!前面還有士多啤梨味的妹子啊,決不能放棄!物件中資料不能影響到物件指標的任何可操作性;

6,人生在世,難免會遇到各種各樣的人和事,靠譜的不靠譜的也很多,「你人生中最驚險的記憶是什麼?」「額,二十多年前,後便追了幾億個弟兄,差點跑輸了」

...每當生活不如意時,時刻想想,我這麼艱難的一刻都熬過來了,後面的各種屬性方法,尤其是各種

null

,野指標

,豈不是責無旁貸?!

robustness

魯棒性一定要夠!構造,析構時,一定要考慮到各種突發的情況;

7,宣告時直接賦值,檢視彙編**,會發現直接呼叫的的是拷貝建構函式,而非過載的 「=

」操作符;確切地說法是

複製初始化

和賦值初始化

,展開來說,賦值初始化確切地說不屬於建構函式範圍,建構函式在編譯級上我們就不能不能

顯式呼叫

,但在成員函式中我們可以,但是自我規定,同樣不要呼叫(如物件之前如果申請了一塊記憶體,直接呼叫建構函式時,指標會被直接設

null,而申請的記憶體卻未釋放

),可以是複製初始化的建構函式(

剛產生的物件)內部再去呼叫賦值初始化(

已產生、剛產生的物件呼叫),這樣之於人是一種專注的態度,專注於自身業務,最求最明晰的責任範疇,用於類,則可以避免很多問題。

構造和析構的幾點注意事項

變數要初始化,初始化盡量使用初始化列表。如果不初始化,變數的值是隨機不確定的。class point 改進之後後 class point private int x int y 私有析構函式,類物件不能在棧上分配空間.只能在堆上分配,但不能delete直接釋放。include using names...

有關析構函式和建構函式的幾點說明

有關析構函式和建構函式的幾點說明 建構函式和析構函式都不能被繼承 建構函式和析構函式是用來處理物件的建立和析構的,它們只知道對在它們的特殊層次的物件做什麼。所以,在整個層次中的所有的建構函式和析構函式都必須被呼叫而不能被繼承。建構函式可以過載,析構函式不可以過載 建構函式可以有引數,析構函式沒有引數...

C 多個物件構造 析構 構造和析構的順序

include 多個物件構造和析構 1 當類中有成員變數是其它類的物件時,首先呼叫成員變數的建構函式,呼叫順序與宣告順序相同 之後呼叫自身類的建構函式 2 析構函式的呼叫順序與對應的構造函式呼叫順序相反 2 類成員中若有const修飾,必須在物件初始化的時候,給const int n 賦值 當類成員...