C 入門教程(五十七) 預設和刪除

2021-08-18 05:57:08 字數 2512 閱讀 7219

小古銀的官方**(完整教程):

delete

鞏固練習

這篇說的內容還是建構函式和析構函式,我知道你看到這裡會開始有點不耐煩了,怎麼這麼多建構函式和析構函式,基礎太多。其實這個不難,所以不要擔心,而且後面還有幾種建構函式。再耐心把它學好,寫**將會很有用的。。。大概吧(*・_・)ノ⌒*

但是你想想,你設計乙個類給別人用的時候,就是寫開源**的時候,你必須要封裝好,別人用的時候才能用得方便用得爽,用得爽了別人就覺得你niubility。ԅ(¯﹃¯ԅ)

當類中沒有建構函式的時候,編譯器就會加乙個預設建構函式;當你加了乙個建構函式的時候,例如過載的乙個建構函式,那麼就不會再有預設建構函式。舉個例子:

#include class test

};int main(void)

這時候如果需要無引數地建立物件,並且又不需要在建構函式裡進行操作,就可以:

#include class test

};int main(void)

建構函式宣告後加= default;,就可以把預設建構函式調出來,而且還可以不用寫函式定義。當然,如果你的建構函式裡是有操作的,那麼它就不是預設建構函式,不能用關鍵字default,而且你還是要把它的定義寫出來,這樣你才能操作。

最後輪到預設析構函式:~test(void) = default;

因為如果需要在析構函式裡寫**,那麼肯定要寫出析構函式;如果不需要在析構函式裡寫**,不寫的話,編譯器也會給加上。所以看上去沒什麼用處。

如果類用作基類,供其他類繼承的話,預設析構函式就有作用了,這時候需要這樣寫virtual ~test(void) = default;。至於為什麼這樣寫,後續教程將會講解。

關鍵字default只能作用在有預設函式的函式上,也就是說,只能用在預設建構函式預設複製建構函式預設轉移建構函式預設複製賦值運算子預設移動賦值運算子預設析構函式上

關鍵字delete用於刪除函式,即如果你呼叫了刪除的函式,編譯器編譯的時候就會報錯。關鍵字deletedefault不同,delete可以用在所有的函式上。

delete用得最多的情況,還是用在建構函式上。例如,std::unique_ptr不能複製只能轉移,所以std::unique_ptr的複製建構函式是這樣寫的:unique_ptr(const unique_ptr &) = delete;,那麼當你嘗試複製std::unique_ptr物件時,編譯時就會報錯。

delete用在其他函式時的用法也是跟上面的一樣,只需要在函式宣告的後面,分號;的前面加上= delete即可。由於函式已經刪除,所以你也沒有寫函式定義的必要了。

完成******_vectorpush_back()pop_back()

提示

push_back():先申請m_size + 1int的堆記憶體並且用臨時變數儲存,這樣可以保證無論m_array是否儲存位址都不會出錯。當沒有元素時,就不需要複製舊記憶體的資料了,而且也沒有記憶體可以釋放;相反,當有元素時就需要複製舊記憶體的資料,複製完沒什麼事就可以把舊記憶體釋放掉。然後把新的資料存放到連續記憶體的最後,接著把新記憶體位址賦值給m_array並且m_size自增就完事了。

pop_back():當本來就沒有元素時是不能再刪除最後乙個元素,這是需要注意的,接著就剩下有元素的情況了。申請新的m_size - 1個記憶體,然後將除了最後乙個資料的舊資料複製到新記憶體中,釋放舊記憶體,接著把新記憶體位址賦值給m_array並且m_size自減就完事了。

當呼叫std::vectorpop_back()的時候,由於標準沒有規定pop_back()必須要檢測是否有元素,如果此時std::vector物件沒有元素,那麼將會引發未定義行為,所以使用std::vectorpop_back()時,需要注意容器內是否有元素。這些都是明確寫在說明文件裡面的,看文件時需要留心。

C 入門教程

c 是c語言的繼承,它既可以進行c語言的過程化程式設計,又可以進行以抽象資料型別為特點的基於物件的程式設計,還可以進行以繼承和多型為特點的物件導向的程式設計。c 擅長物件導向程式設計的同時,還可以進行基於過程的程式設計,因而c 就適應的問題規模而論,大小由之。c 不僅擁有計算機高效執行的實用性特徵,...

Shell 入門教程(十七) 如何使用陣列

shell 中有陣列這個概念,陣列中可以存放多個值。但 shell 只支援一維陣列,不支援多維陣列,初始化時不需要定義陣列大小。與大部分程式語言類似,陣列元素的下標由0開始。shell 陣列用括號來表示,元素用 空格 符號分割開,語法格式如下 array name value1 valuen 例如 ...

c 入門教程 一

事前日常敲黑板 1 從現在開始 我寫的東西不一定完全是正確的,有些只是看了看理論,沒有實際驗證過,有些驗證過但是不同的編譯器會有不同的效果,所以建議有能力的話手動去試一下。我說的和書上寫的都不一定是對的,但是編譯器實際跑出來的結果在這個編譯器 假裝就是昨天那個軟體了 上就是對的。2 明天的內容可能會...