這篇文章主要介紹“C++11中怎么將=default用于拷貝控制成員”,在日常操作中,相信很多人在C++11中怎么將=default用于拷貝控制成員問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”C++11中怎么將=default用于拷貝控制成員”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
創(chuàng)新互聯(lián)公司是專業(yè)的黑山網(wǎng)站建設公司,黑山接單;提供網(wǎng)站設計、成都網(wǎng)站制作,網(wǎng)頁設計,網(wǎng)站設計,建網(wǎng)站,PHP網(wǎng)站建設等專業(yè)做網(wǎng)站服務;采用PHP框架,可快速的進行黑山網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團隊,希望更多企業(yè)前來合作!
編譯器自動生成的操作
有一定經(jīng)驗的C++程序員都會知道,C++編譯器會自動生成一些默認操作:
默認構(gòu)造函數(shù)
析構(gòu)函數(shù)
拷貝構(gòu)造函數(shù)
賦值運算符
移動構(gòu)造函數(shù)
移動賦值運算符
這些操作被分為兩組:默認構(gòu)造函數(shù)自己為一組,其他的5個為一組。
如果程序員定義了任意的構(gòu)造函數(shù),編譯器就不再生成默認構(gòu)造函數(shù)。
后面5個操作被分為一組,稱作拷貝控制成員,用于處理類對象(拷貝)的復制,賦值和銷毀。注意這里的拷貝是名詞而不是動詞。如果程序員定義了5個成員中的任意一個,編譯器就不會自動生成其他的成員。
作者的理解
為什么要這樣分組呢?這里分幾種情況討論。
簡單的數(shù)據(jù)類
這時類的功能和C語言的結(jié)構(gòu)體類似,類本身沒有功能,甚至不會定義構(gòu)造函數(shù)。這種情況下,C++編譯器會自動生成默認構(gòu)造函數(shù),數(shù)據(jù)成員的值執(zhí)行默認初始化。
雖然默認初始化的結(jié)果不一定就是程序員想要的,但是一般也不會有什么問題:程序員會另外賦值。
沒有資源管理的功能類
和簡單數(shù)據(jù)類相比,這種類比簡單數(shù)據(jù)類增加了相應的內(nèi)部邏輯,因此數(shù)據(jù)成員之間也會有一些內(nèi)在的聯(lián)系。這時默認初始化往往就不能滿足要求了,解決方法就是定義構(gòu)造函數(shù)。
作為C++編譯器,一旦程序員定義了構(gòu)造函數(shù),就可以認為默認初始化已經(jīng)不能滿足程序員的需求而不再生成默認的構(gòu)造函數(shù)了。這種處理方式在大多數(shù)情況下會更安全。
C++11以后,如果程序員還是希望編譯器生成默認構(gòu)造函數(shù),可以通過=default來實現(xiàn)。
由于不存在資源管理的需求,這個類還不是必須定義析構(gòu)函數(shù)。
包含資源管理的功能類
一旦類中包含了需要釋放的資源,如內(nèi)存,端口,文件等,就需要定義一個析構(gòu)函數(shù)來釋放這些資源。析構(gòu)函數(shù)在對象銷毀時被自動調(diào)用,正好可以完成這個任務。一般來講,一旦析構(gòu)函數(shù)中需要釋放資源,在其他的拷貝控制成員也需要進行相應的處理。
和自動生成默認構(gòu)造函數(shù)的規(guī)則類似,如果程序員定義了某個拷貝控制成員,編譯器就不再自動生成其他的。
當然也存在像淺拷貝那樣,編譯器生成的拷貝控制成員就可以滿足需求的情況,這時可以對拷貝控制成員使用=default要求編譯器生成某些拷貝控制成員。
這就是本文的標題。
實例
老鳥的疑惑
如果你是C++老鳥,也許你會說,關(guān)于拷貝控制成員的生成規(guī)則,我用的C++編譯器并不是這樣的呀?
這一點,請看權(quán)威書籍的解釋:
不幸的是,第二條規(guī)則不是完整施行的:出于向后兼容的需求,即使程序員定義了析構(gòu)函數(shù),編譯器還是會自動生成拷貝構(gòu)造函數(shù)和拷貝賦值運算符。但是這一特征在ISO標準中已經(jīng)啟用了,你可以期望一個現(xiàn)代編譯器能對此給出警告。
到此,關(guān)于“C++11中怎么將=default用于拷貝控制成員”的學習就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
文章標題:C++11中怎么將=default用于拷貝控制成員
網(wǎng)站網(wǎng)址:http://weahome.cn/article/jssedd.html