您好,登錄后才能下訂單哦!
這篇文章主要介紹“C++11中怎么將=default用于拷貝控制成員”,在日常操作中,相信很多人在C++11中怎么將=default用于拷貝控制成員問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”C++11中怎么將=default用于拷貝控制成員”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
編譯器自動生成的操作
有一定經驗的C++程序員都會知道,C++編譯器會自動生成一些默認操作:
默認構造函數
析構函數
拷貝構造函數
賦值運算符
移動構造函數
移動賦值運算符
這些操作被分為兩組:默認構造函數自己為一組,其他的5個為一組。
如果程序員定義了任意的構造函數,編譯器就不再生成默認構造函數。
后面5個操作被分為一組,稱作拷貝控制成員,用于處理類對象(拷貝)的復制,賦值和銷毀。注意這里的拷貝是名詞而不是動詞。如果程序員定義了5個成員中的任意一個,編譯器就不會自動生成其他的成員。
作者的理解
為什么要這樣分組呢?這里分幾種情況討論。
簡單的數據類
這時類的功能和C語言的結構體類似,類本身沒有功能,甚至不會定義構造函數。這種情況下,C++編譯器會自動生成默認構造函數,數據成員的值執行默認初始化。
雖然默認初始化的結果不一定就是程序員想要的,但是一般也不會有什么問題:程序員會另外賦值。
沒有資源管理的功能類
和簡單數據類相比,這種類比簡單數據類增加了相應的內部邏輯,因此數據成員之間也會有一些內在的聯系。這時默認初始化往往就不能滿足要求了,解決方法就是定義構造函數。
作為C++編譯器,一旦程序員定義了構造函數,就可以認為默認初始化已經不能滿足程序員的需求而不再生成默認的構造函數了。這種處理方式在大多數情況下會更安全。
C++11以后,如果程序員還是希望編譯器生成默認構造函數,可以通過=default來實現。
由于不存在資源管理的需求,這個類還不是必須定義析構函數。
包含資源管理的功能類
一旦類中包含了需要釋放的資源,如內存,端口,文件等,就需要定義一個析構函數來釋放這些資源。析構函數在對象銷毀時被自動調用,正好可以完成這個任務。一般來講,一旦析構函數中需要釋放資源,在其他的拷貝控制成員也需要進行相應的處理。
和自動生成默認構造函數的規則類似,如果程序員定義了某個拷貝控制成員,編譯器就不再自動生成其他的。
當然也存在像淺拷貝那樣,編譯器生成的拷貝控制成員就可以滿足需求的情況,這時可以對拷貝控制成員使用=default要求編譯器生成某些拷貝控制成員。
這就是本文的標題。
實例
老鳥的疑惑
如果你是C++老鳥,也許你會說,關于拷貝控制成員的生成規則,我用的C++編譯器并不是這樣的呀?
這一點,請看權威書籍的解釋:
不幸的是,第二條規則不是完整施行的:出于向后兼容的需求,即使程序員定義了析構函數,編譯器還是會自動生成拷貝構造函數和拷貝賦值運算符。但是這一特征在ISO標準中已經啟用了,你可以期望一個現代編譯器能對此給出警告。
到此,關于“C++11中怎么將=default用于拷貝控制成員”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。