小古銀的官方**(完整教程):
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
用於刪除函式,即如果你呼叫了刪除的函式,編譯器編譯的時候就會報錯。關鍵字delete
與default
不同,delete
可以用在所有的函式上。
delete
用得最多的情況,還是用在建構函式上。例如,std::unique_ptr
不能複製只能轉移,所以std::unique_ptr
的複製建構函式是這樣寫的:unique_ptr(const unique_ptr &) = delete;
,那麼當你嘗試複製std::unique_ptr
物件時,編譯時就會報錯。
當delete
用在其他函式時的用法也是跟上面的一樣,只需要在函式宣告的後面,分號;
的前面加上= delete
即可。由於函式已經刪除,所以你也沒有寫函式定義的必要了。
完成******_vector
的push_back()
和pop_back()
。
提示:
push_back()
:先申請m_size + 1
個int
的堆記憶體並且用臨時變數儲存,這樣可以保證無論m_array
是否儲存位址都不會出錯。當沒有元素時,就不需要複製舊記憶體的資料了,而且也沒有記憶體可以釋放;相反,當有元素時就需要複製舊記憶體的資料,複製完沒什麼事就可以把舊記憶體釋放掉。然後把新的資料存放到連續記憶體的最後,接著把新記憶體位址賦值給m_array
並且m_size
自增就完事了。
pop_back()
:當本來就沒有元素時是不能再刪除最後乙個元素,這是需要注意的,接著就剩下有元素的情況了。申請新的m_size - 1
個記憶體,然後將除了最後乙個資料的舊資料複製到新記憶體中,釋放舊記憶體,接著把新記憶體位址賦值給m_array
並且m_size
自減就完事了。
當呼叫std::vector
中pop_back()
的時候,由於標準沒有規定pop_back()
必須要檢測是否有元素,如果此時std::vector
物件沒有元素,那麼將會引發未定義行為,所以使用std::vector
的pop_back()
時,需要注意容器內是否有元素。這些都是明確寫在說明文件裡面的,看文件時需要留心。
C 入門教程
c 是c語言的繼承,它既可以進行c語言的過程化程式設計,又可以進行以抽象資料型別為特點的基於物件的程式設計,還可以進行以繼承和多型為特點的物件導向的程式設計。c 擅長物件導向程式設計的同時,還可以進行基於過程的程式設計,因而c 就適應的問題規模而論,大小由之。c 不僅擁有計算機高效執行的實用性特徵,...
Shell 入門教程(十七) 如何使用陣列
shell 中有陣列這個概念,陣列中可以存放多個值。但 shell 只支援一維陣列,不支援多維陣列,初始化時不需要定義陣列大小。與大部分程式語言類似,陣列元素的下標由0開始。shell 陣列用括號來表示,元素用 空格 符號分割開,語法格式如下 array name value1 valuen 例如 ...
c 入門教程 一
事前日常敲黑板 1 從現在開始 我寫的東西不一定完全是正確的,有些只是看了看理論,沒有實際驗證過,有些驗證過但是不同的編譯器會有不同的效果,所以建議有能力的話手動去試一下。我說的和書上寫的都不一定是對的,但是編譯器實際跑出來的結果在這個編譯器 假裝就是昨天那個軟體了 上就是對的。2 明天的內容可能會...