進一步理解C 11中特種成員函式的生成規則

2021-10-07 07:25:10 字數 1214 閱讀 3239

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 按照正常的情況,如果我們要建...

前端進一步理解

非常開心能夠在這裡作工作匯報和個人總結,這是我鼓起勇氣的結果,算是成功了一半,呵呵。從剛來公司茫然失措的菜蛋到現在稍顯成熟的菜鳥,我知道我離成功又進了一步。以下是我對前端的理解和對自己這段時間的總結 一 前端職責 前端開發是由網頁製作演變而來的,它的主要職能就是把 的介面更好地呈現給使用者,主要包括...