• <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ù)中心

               :: 首頁(yè) :: 聯(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++語(yǔ)言提供這種特性,我想在有些時(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; 這條語(yǔ)句將不能通過編譯。在vs05下的編譯錯(cuò)誤提示如下
            error C2440: 'initializing' : cannot convert from 'int' to 'CExample'
                    Constructor for class 'CExample' is declared 'explicit'
            對(duì)于某些類型,這一情況非常理想。但在大部分情況中,隱式轉(zhuǎn)換卻容易導(dǎo)致錯(cuò)誤(不是語(yǔ)法錯(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)論
              

            久久久久中文字幕| 区久久AAA片69亚洲| 久久久久久免费一区二区三区| 久久久久99精品成人片试看| 久久亚洲欧美国产精品| 成人午夜精品久久久久久久小说 | 性做久久久久久久| 久久久久女人精品毛片| 婷婷久久综合九色综合98| 久久亚洲中文字幕精品一区| 久久天天躁夜夜躁狠狠躁2022| 九九精品99久久久香蕉| 久久精品aⅴ无码中文字字幕不卡| 国产精品久久久久久久久鸭 | 久久人妻少妇嫩草AV无码专区| 精品久久一区二区| 亚洲国产精品无码久久九九| 久久综合综合久久综合| 一级做a爰片久久毛片毛片| 久久w5ww成w人免费| 麻豆国内精品久久久久久| 久久91精品国产91久久小草 | 欧美一区二区精品久久| 久久综合久久美利坚合众国| 久久久WWW免费人成精品| 国产精品久久久亚洲| 国产精品久久久久久久久软件| 久久夜色精品国产亚洲| AV狠狠色丁香婷婷综合久久 | 久久精品视频网| 亚洲精品无码久久千人斩| 久久无码国产| 国产精品天天影视久久综合网| 久久777国产线看观看精品| 7777久久久国产精品消防器材| 少妇久久久久久被弄到高潮| 久久综合狠狠综合久久激情 | 久久婷婷人人澡人人| 99久久婷婷国产综合亚洲| 久久人人妻人人爽人人爽| 2020久久精品亚洲热综合一本|