c++11中的特種成員函式是指編譯器會自動生成的函式:預設建構函式、析構函式、拷貝建構函式、拷貝賦值運算子、移動建構函式、移動賦值運算子。
對於特種成員函式,c++編譯器生成的特種成員函式都是public訪問級別,且一般都是非虛函式。
之所以說都是非虛函式,是因為存在一種情況會使編譯器生成的析構函式為虛函式:
class a
a(const a&)
a(a&&)
virtual ~a() {}
};class b : public a ;
此時,類b中生成的析構函式便是虛析構函式。
如果你宣告了拷貝建構函式,拷貝賦值運算子或者析構函式中的任何乙個,你就需要同時宣告這三個。
一般這樣做是處於:如果有改寫複製操作的要求,往往意味著該類需要執行某種資源管理。 而這也意味著:在一種複製操作中執行的資源管理也要在另一種複製操作中執行、該類的析構函式需要參與進來以釋放資源。
通過下面乙個簡短的**來說明移動建構函式與拷貝建構函式的關係:
#include class a
a(const a&)
a(a&&)
virtual ~a() {}
};int main()
上述執行結果為:
修改上述**:注釋掉拷貝建構函式後:
#include class a
/*a(const a&) */
a(a&&)
virtual ~a() {}
};int main()
此時,編譯器會報錯:error: use of deleted function 'constexpr a::a(const a&)'
22 | a c = a;
也就是說 移動建構函式的存在阻礙了編譯器生成預設拷貝建構函式。
同理,當我們注釋掉移動建構函式的時候,會發現拷貝建構函式也阻礙的編譯器生成預設移動建構函式。
總結:
由大三律知,只要類中宣告了拷貝建構函式、拷貝賦值運算子、析構函式中的任何乙個,則會阻礙編譯器生成預設移動建構函式和移動賦值運算子。
bufferedReader進一步理解
public static void main string args string mystring system.out.println 請輸入明文 bufferedreader buf new bufferedreader new inputstreamreader system.in try...
進一步理解委託
前面一篇文章介紹了委託的基本知識,接下來就進一步研究一下委託。其實,剛開始覺得委託型別是乙個比較難理解的概念,怎麼也不覺得下面的 assembleiphonehandler 是乙個型別。public delegate void assembleiphonehandler 按照正常的情況,如果我們要建...
前端進一步理解
非常開心能夠在這裡作工作匯報和個人總結,這是我鼓起勇氣的結果,算是成功了一半,呵呵。從剛來公司茫然失措的菜蛋到現在稍顯成熟的菜鳥,我知道我離成功又進了一步。以下是我對前端的理解和對自己這段時間的總結 一 前端職責 前端開發是由網頁製作演變而來的,它的主要職能就是把 的介面更好地呈現給使用者,主要包括...