C 中常見的一些小問題總結(一)

2022-04-28 15:57:06 字數 1194 閱讀 8763

1.類的建構函式過程,如何讓類例項化時,不呼叫建構函式(或類destroy的時候不呼叫析構函式)?

首先,我們要知道知道類的建構函式的作用是什麼,當然很多人會說是在裡面進行類的初始化的,沒錯,但是很多人弄清楚類的基本資源申請也是由他完成的,這裡不得不提到一組關鍵字:new/delete與malloc/free,你可能已經注意到我的說法,是關鍵字而不是稱呼他們為函式,因為他們是完全不同的概念。前者是c++的運算子,後者才是c/c++的標準庫函式。

其次,這兩組數是有區別的,雖然我們一般不會去過分關注,至少我在使用的時候更偏向於new和delete。其實,它們都可用於申請動態記憶體和釋放記憶體。對於非內部資料型別的物件而言,光用maloc/free無法滿足動態物件的要求。物件在建立的同時要自動執行建構函式,物件在消亡之前要自動執行析構函式。由於malloc/free是庫函式而不是運算子,不在編譯器控制許可權之內,不能夠把執行建構函式和析構函式的任務強加於malloc/free。因此c++語言需要乙個能完成動態記憶體分配和初始化工作的運算子new,以及乙個能完成清理與釋放記憶體工作的運算子delete。注意new/delete不是庫函式。

於是,我們又有些映像,好像new和delete的時候,那他們又與上面的new和delete有什麼區別呢?

int *p= new int[2];

delete p;//這裡呼叫的過程是先析構p[0],然後再析構釋放p[1];

這裡就是他們的區別,當new的物件是乙個陣列時,系統維護的自然就是這個物件的陣列指標,當我們delete p時,其實只是釋放了p[0],其他指標物件則會變成引起程式bug的野指標。

2.對於第二個問題,當然你現在已經明白該如何去解答了,其實就是讓malloc吧類中建構函式該幹的基本任務(申請記憶體)給幹了,那析構函式自然就沒有執行的意義了,那麼下面就來完成這個想法的實驗吧:

class a

void pout(){cout<<"b fuction works!"b* p=(b*) malloc(sizeof(b));

p->pout;

輸出結果為:b function works!這裡的a建構函式和b建構函式就被遮蔽了。

3.如果你想通過p來呼叫a中的函式pout0(),是否可以使用p呢,答案是肯定的,只是要注意類繼承的屬性到底是私有的還是共有的,前者的父類訪問許可權是有限制的,所以你需要對子類的繼承做修改即可。

以上就是一點小小的總結,以後會繼續的,歡迎各位討論交流,才開始寫博和分享,主要是有些時間。謝謝各位指點~

一些小問題

1 曼徹斯特編碼和差分曼徹斯特編碼。曼徹斯特編碼,常用於區域網傳輸。在曼徹斯特編碼中,每一位的中間有一跳變,位中間的跳變既作時鐘訊號,又作資料訊號 從高到低跳變表示 1 從低到高跳變表示 0 還有一種是差分曼徹斯特編碼,每位中間的跳變僅提供時鐘定時,而用每位開始時有無跳變表示 0 或 1 有跳變為 ...

一些小問題

問1 子類繼承了父類的所有成員,對嗎?答1 錯,至少子類沒有繼承父類的建構函式 析構函式不知有沒有繼承,但複製建構函式肯定是繼承了 class a a intx a const a a a operator const a a class b public a intmain view code 問...

一些小問題

最近使用win10出現了很多問題,簡單總結一二。第一,剛建登陸使用者時,使用者名稱搞成了中文的,於是乎eclipse中 總是報錯,想改名發現改不了,必須先將家庭版公升級為專業版才可以建立乙個admin許可權的賬戶登入,然後修改c users 張三中的張三為英文。第二,我的電腦不在桌面上,進去麻煩,要...