• <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++ 技術(shù)中心

               :: 首頁 :: 聯(lián)系 ::  :: 管理
              160 Posts :: 0 Stories :: 87 Comments :: 0 Trackbacks

            公告

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

            留言簿(27)

            搜索

            •  

            最新隨筆

            最新評(píng)論

            評(píng)論排行榜

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

            Feedback

            # re: C++中的explicit關(guān)鍵字 2014-11-26 14:05 evilwk
            explicit的作用,可以禁止“單參數(shù)構(gòu)造函數(shù)”被用于自動(dòng)類型轉(zhuǎn)換

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

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

            int main()
            {
            Test1 t1 = 12; //隱式調(diào)用其構(gòu)造函數(shù), 成功
            Test2 t2 = 12; //編譯錯(cuò)誤,不能隱式調(diào)用其構(gòu)造函數(shù)
            Test2 t3(12); //顯式調(diào)用成功
            return 0;
            }  回復(fù)  更多評(píng)論
              

            2021国内精品久久久久久影院| 无码乱码观看精品久久| 97久久精品无码一区二区天美| 久久无码人妻一区二区三区| 国产精品一久久香蕉产线看 | 久久久久高潮毛片免费全部播放| 久久精品aⅴ无码中文字字幕不卡 久久精品aⅴ无码中文字字幕重口 | 久久婷婷激情综合色综合俺也去| 色综合久久综精品| 人人妻久久人人澡人人爽人人精品| 国产亚洲精品久久久久秋霞| 国产成人精品久久亚洲高清不卡 | 久久久久久久免费视频| 欧美精品一本久久男人的天堂| 国产精品久久久久久五月尺| 久久精品国产精品青草app| 欧美国产精品久久高清| 97精品伊人久久久大香线蕉| 思思久久精品在热线热| 久久久久亚洲精品天堂久久久久久 | 久久久久久亚洲精品无码| 国产精品99精品久久免费| 久久久久久精品无码人妻| 日韩欧美亚洲综合久久影院Ds| 久久综合九色综合97_久久久| 99精品国产99久久久久久97 | 中文国产成人精品久久不卡| 久久久久国产精品三级网| 久久精品成人| 国产精品免费久久久久影院| 国产亚州精品女人久久久久久| 精品人妻久久久久久888| 久久亚洲国产成人精品性色| 麻豆亚洲AV永久无码精品久久| 人妻精品久久无码区| 婷婷五月深深久久精品| 久久精品中文騷妇女内射| 99re这里只有精品热久久| 婷婷综合久久中文字幕| 久久国产成人午夜AV影院| 怡红院日本一道日本久久|