日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

          歡迎訪問 生活随笔!

          生活随笔

          當前位置: 首頁 > 编程语言 > c/c++ >内容正文

          c/c++

          深入理解C++中的explicit关键字

          發布時間:2023/12/20 c/c++ 40 豆豆
          生活随笔 收集整理的這篇文章主要介紹了 深入理解C++中的explicit关键字 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
          深入理解C++中的explicit關鍵字

          kezunhai@gmail.com

          http://blog.csdn.net/kezunhai


          ? ? ? ? ?C++中的explicit關鍵字只能用于修飾只有一個參數構造函數, 它的作用是表明該構造函數是顯示的, 而非隱式的, 跟它相對應的另一個關鍵字是implicit, 意思是隱藏的,構造函數默認情況下即聲明為implicit(隱式)。

          ? ? ? ? ?關于explicit關鍵字,先看看MSDN上的解釋:

          ? ? ? ??This keyword is a declaration specifier that can?only be applied to in-class constructor declarations. An explicit constructor cannot take part in implicit conversions. It can?only be used to explicitly construct an object

          ? ? ? ? 從上面的解釋可以看到, explicit關鍵字的作用:禁止隱式調用類內的單參數構造函數,這主要包括如下三層意思:

          ? ? ? ? ?(1)該關鍵字只能用來修飾類內部的構造函數

          ? ? ? ? ?(2)禁止隱式調用拷貝構造函數

          ? ? ? ? ?(3)禁止類對象之間的隱式轉換

          ??? ? ? ? ?首先,來看看隱式轉換,如下例:

          [cpp]?view plaincopy
        1. class?CExplict??
        2. {??
        3. public:??
        4. ????CExplict();??
        5. ????CExplict(?bool?_explicit)??
        6. ????{??
        7. ????????this->is_explict?=?_explicit;??
        8. ????}??
        9. ????CExplict(const?CExplict&?other)??
        10. ????{??
        11. ????????this->is_explict?=?other.is_explict;??
        12. ????}??
        13. ????friend?void?printExplicit(const?CExplict&?cx);//友元函數的實現可以在類外定義,但必須在類內部聲明?
        14. ??
        15. private:??
        16. ????bool?is_explict;??
        17. };??
        18. ??
        19. void?printExplicit(const?CExplict&?cx)??
        20. {??
        21. ????cout<<"is_explict="<<cx.is_explict<<endl;??
        22. }??
        23. ??
        24. int?main(?int?argc,?char*?argv[])??
        25. {??
        26. ????CExplict?cx1?=?true;??
        27. ????CExplict?cx2?=?cx1;??
        28. ????printExplicit(cx1);??
        29. ????printExplicit(cx2);??
        30. ????printExplicit(false);??
        31. ????getchar();??
        32. ????return?1;??
        33. }??
        34. ? ? ? 在上面的代碼中:

          [cpp]?view plaincopy
        35. CExplict?cx1?=?true;??
        36. CExplict?cx2?=?cx1;??
        37. printExplicit(false);??
        38. 隱式調用CExplict類的單參數構造函數。這種調用在C++語法中是允許的,但是諸如:CExplict cx1 = true和printExplicit(false)這種表達形式看著很別扭,也很讓人費解,將一個bool型的值賦給一個CExplicit類的cx1,使代碼的可讀性變差。

          ? ? ? ? ? 因此,為了禁止對類的單參數構造函數的隱式調用,C++引入了關鍵字explicit。在類的定義中,在任何一個單參數構造函數錢加explicit關鍵字,就可以禁止對該構造函數的隱式調用。如下:

          [cpp]?view plaincopy
        39. class?CExplict??
        40. {??
        41. public:??
        42. ????CExplict();??
        43. ????explicit?CExplict(?bool?_explicit)??
        44. ????{??
        45. ????????this->is_explict?=?_explicit;??
        46. ????}??
        47. ????CExplict(const?CExplict&?other)??
        48. ????{??
        49. ????????this->is_explict?=?other.is_explict;??
        50. ????}??
        51. ????friend?void?printExplicit(const?CExplict&?cx);????
        52. ??
        53. private:??
        54. ????bool?is_explict;??
        55. };??
        56. ??
        57. void?printExplicit(const?CExplict&?cx)??
        58. {??
        59. ????cout<<"is_explict="<<cx.is_explict<<endl;??
        60. }??
        61. ??
        62. int?main(?int?argc,?char*?argv[])??
        63. {??
        64. ????CExplict?cx1?=?true;??
        65. ????CExplict?cx2?=?cx1;??
        66. ????printExplicit(cx1);??
        67. ????printExplicit(cx2);??
        68. ????printExplicit(false);??
        69. ????getchar();??
        70. ????return?1;??
        71. }??
        72. 此時,在調用上面一段代碼,則會報: ?error C2440: “初始化”: 無法從“bool”轉換為“CExplict”的錯誤,為了使程序能正確運行,需要將main函數內的代碼改為:

          [cpp]?view plaincopy
        73. int?main(?int?argc,?char*?argv[])??
        74. {??
        75. ????CExplict?cx1(true);??
        76. ????CExplict?cx2(cx1);??
        77. ????printExplicit(cx1);??
        78. ????printExplicit(cx2);??
        79. ????printExplicit(CExplict(false));??
        80. ????getchar();??
        81. ????return?1;?????
        82. }??
        83. 至此,程序就可以正常運行,而且進一步增加了程序的可讀性。

          ? ? ? ? ?總結:

          ? ? ? ? (1)explicit關鍵字只需用于類內的單參數構造函數前面。由于無參數的構造函數和多參數的構造函數總是顯示調用,這種情況在構造函數前加explicit無意義。

          ? ? ? ? (2)如果想禁止類A對象被隱式轉換為類B對象,可在類B中使用關鍵字explicit,即定義這樣的轉換構造函數

          [cpp]?view plaincopy
        84. ???????explicit?B(A?a)??
        85. {??
        86. ??
        87. }??
        88. explicit?B(const?A?&a)??
        89. {??
        90. ??
        91. }??
        92. ? ? ? ? google的c++規范中提到explicit的優點是可以避免不合時宜的類型變換,缺點無。所以google約定所有單參數的構造函數都必須是顯示的,只有極少數情況下拷貝構造函數可以不聲明稱explicit。例如作為其他類的透明包裝器的類。
            effective c++中說:被聲明為explicit的構造函數通常比其non-explicit兄弟更受歡迎。因為它們禁止編譯器執行非預期(往往也不被期望)的類型轉換。除非我有一個好理由允許構造函數被用于隱式類型轉換,否則我會把它聲明為explicit,鼓勵大家遵循相同的政策。

          作者:kezunhai出處:http://blog.csdn.net/kezunhai歡迎轉載或分享,但請務必聲明文章出處。

          from:https://blog.csdn.net/kezunhai/article/details/38417087

          總結

          以上是生活随笔為你收集整理的深入理解C++中的explicit关键字的全部內容,希望文章能夠幫你解決所遇到的問題。

          如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。