05 編譯器自動合成的函式
一般情況下,如果我們的類沒有自定義的建構式、拷貝建構式、以及復制運算子多載,那么編譯器就會為我們自動合成一個這些函式,因此當你寫一個空類時,其實你的代碼實際上是包含這些函式的,但是編譯器將他隱藏了,
當你需要用到這些函式時,編譯器就會合成這些函式,

含有參考 &和const成員變數會阻止合成賦值和拷貝
在C++語言中,對于某個變數的參考,一旦我們確定了某個變數參考了某個物件,則這個參考將不能在指向其它物件,
而對于const屬性的成員,我們將不能對其賦值和修改,因此如果某個類中含有const或者參考的的成員變數時編譯器將不能為這種類合成默認的拷貝構造和賦值運算子,此時需要用戶自己定義相應的操作,

06 明確拒絕編譯器合成函式的方法
如果某個基類的默認賦值運算子被定為private,那么這個基類的所有派生類將不能生成默認的賦值運算子,因為每個基類的賦值運算應該能拷貝父類的成員,但是其父類的默認合成為private,所以沒法完成賦值,編譯器將會報錯,
因此,當我們需要阻止編譯器生成相應的默認函式時,我們就可以采用將其基類的默認合成宣告為私有的,但是這并不是完全安全的,因為他的成員函式和友元依然可以訪問,所以我們將默認合成宣告為私有的同時我們不能實作這些函式,當聲名了這些函式后,編譯器將不會在合成,而當我們帶呼叫這些函式時,編譯器將會發出抱怨,
因此只要我們設計這樣一個這樣的基類,這樣當我們的類想要阻止拷貝時直接該基類即可,
C++11中的阻止合成
在新標準下,我們阻止拷貝的方式可以更加的簡單,在新標準中我們可以用運算子**=delete來阻止生成默認的合成成員,我們只需要在想要阻止的函式后面加上=delete** 即可,

注意:解構式不能是洗掉的
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/266777.html
標籤:其他
上一篇:滲透面試小結2
下一篇:Pikachu靶場練習總結
