• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

               C++ 技術中心

               :: 首頁 :: 聯系 ::  :: 管理
              160 Posts :: 0 Stories :: 87 Comments :: 0 Trackbacks

            公告

            鄭重聲明:本BLOG所發表的原創文章,作者保留一切權利。必須經過作者本人同意后方可轉載,并注名作者(天空)和出處(CppBlog.com)。作者Email:coder@luckcoder.com

            留言簿(27)

            搜索

            •  

            最新隨筆

            最新評論

            評論排行榜

            在C++程序中很少有人去使用explicit關鍵字,不可否認,在平時的實踐中確實很少能用的上。再說C++的功能強大,往往一個問題可以利用好幾種C++特性去解決。但稍微留心一下就會發現現有的MFC庫或者C++標準庫中的相關類聲明中explicit出現的頻率是很高的。了解explicit關鍵字的功能及其使用對于我們閱讀使用庫是很有幫助的,而且在編寫自己的代碼時也可以嘗試使用。既然C++語言提供這種特性,我想在有些時候這種特性將會非常有用。
            按默認規定,只用傳一個參數的構造函數也定義了一個隱式轉換。舉個例子:
            (下面這個CExample沒有什么實際的意義,主要是用來說明問題)
            //Example.h
            #pragma once
            class CExample
            {
            public:
            CExample(void);
            public:
            ~CExample(void);
            public:
            int m_iFirst;
            int m_iSecond;
            public:
            CExample(int iFirst, int iSecond = 4);
            };
            //Example.cpp
            #include "StdAfx.h"
            #include "Example.h"
            CExample::CExample(void)
            : m_iFirst(0)
            {
            }
            CExample::~CExample(void)
            {
            }
            CExample::CExample(int iFirst, int iSecond):m_iFirst(iFirst), m_iSecond(iSecond)
            {
            }
            //TestExplicitKey.cpp
            ...//其它頭文件
            #include "Example.h"
            int _tmain(int argc, _TCHAR* argv[])
            {
            CExample objOne; //調用沒有參數的構造函數
            CExample objTwo(12, 12); //調用有兩個參數的構造函數
            CExample objThree(12); //同上,可以傳一個參數是因為該構造函數的第二個參數有默認值
            CExample objFour = 12; //執行了隱式轉換,等價于CExample temp(12);objFour(temp);注意這個地方調用了
            //編譯器為我們提供的默認復制構造函數
            return 0;
            }
            如果在構造函數聲明中加入關鍵字explicit,如下
            explicit CExample(int iFirst, int iSecond = 4);
            那么CExample objFour = 12; 這條語句將不能通過編譯。在vs05下的編譯錯誤提示如下
            error C2440: 'initializing' : cannot convert from 'int' to 'CExample'
                    Constructor for class 'CExample' is declared 'explicit'
            對于某些類型,這一情況非常理想。但在大部分情況中,隱式轉換卻容易導致錯誤(不是語法錯誤,編譯器不會報錯)。隱式轉換總是在我們沒有察覺的情況下悄悄發生,除非有心所為,隱式轉換常常是我們所不希望發生的。通過將構造函數聲明為explicit(顯式)的方式可以抑制隱式轉換。也就是說,explicit構造函數必須顯式調用。
            引用一下Bjarne Stroustrup的例子:
            class String{
                  explicit String(int n);
                  String(const char *p);
            };
            String s1 = 'a'; //錯誤:不能做隱式char->String轉換
            String s2(10);   //可以:調用explicit String(int n);
            String s3 = String(10);//可以:調用explicit String(int n);再調用默認的復制構造函數
            String s4 = "Brian"; //可以:隱式轉換調用String(const char *p);再調用默認的復制構造函數
            String s5("Fawlty"); //可以:正常調用String(const char *p);
            void f(String);
            String g()
            {
                f(10); //錯誤:不能做隱式int->String轉換
                f("Arthur"); //可以:隱式轉換,等價于f(String("Arthur"));
                return 10; //同上
            }
            在實際代碼中的東西可不像這種故意造出的例子。
            發生隱式轉換,除非有心利用,隱式轉換常常帶來程序邏輯的錯誤,而且這種錯誤一旦發生是很難察覺的。
            原則上應該在所有的構造函數前加explicit關鍵字,當你有心利用隱式轉換的時候再去解除explicit,這樣可以大大減少錯誤的發生。
            posted on 2014-11-24 14:34 C++技術中心 閱讀(2583) 評論(1)  編輯 收藏 引用 所屬分類: C++ 基礎

            Feedback

            # re: C++中的explicit關鍵字 2014-11-26 14:05 evilwk
            explicit的作用,可以禁止“單參數構造函數”被用于自動類型轉換

            class Test1
            {
            public:
            Test1(int n) { num = n; } //普通構造函數
            private:
            int num;
            };

            class Test2
            {
            public:
            explicit Test2(int n) { num = n; } //explicit(顯式)構造函數
            private:
            int num;
            };

            int main()
            {
            Test1 t1 = 12; //隱式調用其構造函數, 成功
            Test2 t2 = 12; //編譯錯誤,不能隱式調用其構造函數
            Test2 t3(12); //顯式調用成功
            return 0;
            }  回復  更多評論
              

            香蕉99久久国产综合精品宅男自 | 精品久久久久中文字幕日本| 久久精品免费全国观看国产| 久久中文字幕精品| AV无码久久久久不卡蜜桃| 中文字幕成人精品久久不卡| 亚洲精品久久久www| 久久精品亚洲中文字幕无码麻豆| 国产91久久综合| 欧美噜噜久久久XXX| 99久久国产综合精品成人影院| 日韩久久久久中文字幕人妻| 久久亚洲精品人成综合网| 久久精品国产欧美日韩| 蜜臀av性久久久久蜜臀aⅴ| 久久影院亚洲一区| 丁香五月综合久久激情| 国内精品久久久久影院免费| 亚洲精品无码久久久久久| 午夜精品久久久久久影视777| 国产精品美女久久久久| AV无码久久久久不卡蜜桃| 四虎国产精品成人免费久久| 成人国内精品久久久久影院VR| 国产人久久人人人人爽| 人妻无码精品久久亚瑟影视 | 久久精品国产99国产精品| 东京热TOKYO综合久久精品| 久久无码专区国产精品发布| 一本色综合久久| 色狠狠久久综合网| 2020久久精品亚洲热综合一本| 三级片免费观看久久| 观看 国产综合久久久久鬼色 欧美 亚洲 一区二区 | 99国产精品久久| 综合久久国产九一剧情麻豆| 久久夜色精品国产亚洲av| 久久91这里精品国产2020| 久久精品成人| 亚洲人成网站999久久久综合| 精品久久久久国产免费 |