国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > C++ > 正文

C++拾趣——類構(gòu)造函數(shù)的隱式轉(zhuǎn)換

2019-11-10 20:24:23
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

        之前看過(guò)一些批判C++的文章,大致意思是它包含了太多的“奇技淫巧”,并不是一門好的語(yǔ)言。我對(duì)這個(gè)“奇技淫巧”的描述頗感興趣,因?yàn)榘凑张姓叩恼f(shuō)法,C++的一些特性恰巧可以讓一些炫耀技術(shù)的同學(xué)有了炫耀的資本——畢竟路人皆知的東西卻沒(méi)什么好炫耀的。這又讓我想起了《孔乙己》中關(guān)于“回”字有幾種寫法的描述。當(dāng)時(shí)老師在上此課時(shí),是抱著批判的態(tài)度去評(píng)價(jià)孔乙己的這種思想,而我卻感覺(jué)到這其中必有一些有意思的文化在里面——或許是“回”字演變的歷程能說(shuō)明什么。所以“回”字相關(guān)的內(nèi)容讓我感覺(jué)孔乙己是個(gè)純粹和可愛(ài)的人。

        寫這個(gè)系列的博文,并不是我想對(duì)C++進(jìn)行什么批判,也不是想對(duì)其進(jìn)行辯護(hù)。只是想羅列一些有意思的東西,故取名拾趣。

        首先我們看下一種比較常見(jiàn)的技術(shù)——類構(gòu)造函數(shù)的隱式轉(zhuǎn)換。這兒先說(shuō)明下,之后的例子中,我會(huì)為了盡量突出主要內(nèi)容,而忽略一些可以作為充分條件但非必要條件的東西,故設(shè)計(jì)的一些代碼存在“不完善”的嫌疑。因?yàn)闉榱硕伦∷新┒矗鶗?huì)讓整個(gè)代碼讓人感覺(jué)其重心并非在我想介紹的技術(shù)上,而在“苦行僧”式的編程原則上。

        我們知道C++是一個(gè)類型嚴(yán)格的語(yǔ)言,比如下面一個(gè)函數(shù)

void test_int_PRoxy(const int_proxy& v) {    printf("%d", v.value());}        調(diào)用者對(duì)其傳參也應(yīng)該是一個(gè)int_proxy的對(duì)象,但是實(shí)際情況并非如此。那該如何表述,我個(gè)人覺(jué)得應(yīng)該是:編譯器對(duì)其傳參應(yīng)該是一個(gè)int_proxy對(duì)象。這兩種表述的區(qū)別就是“調(diào)用者”和“編譯器”的區(qū)別。我們來(lái)看一個(gè)實(shí)際例子,我們先假定int_proxy類這么定義:

class int_proxy {public:    int_proxy(int n) : _m(n) {};public:    int value() const {        return _m;    }private:    int _m;};        該類非常簡(jiǎn)單,它有一個(gè)帶參數(shù)的構(gòu)造函數(shù),并使用參數(shù)列表形式初始化類的成員變量。

        一般情況下我們都會(huì)這么調(diào)用test_int_proxy方法:

    test_int_proxy(int_proxy(100));        這種寫法我想沒(méi)人會(huì)有異議,但是如果出現(xiàn)下面這種寫法,就可能讓人感覺(jué)不可接受了:

    test_int_proxy(100);        然而,這種寫法對(duì)上述類的定義來(lái)說(shuō)是合法的!其效果和使用int_proxy控制住是一樣的。這是為什么呢?這便是類構(gòu)造函數(shù)的隱式轉(zhuǎn)換技術(shù)。C++編譯器認(rèn)為test_int_proxy方法傳入的應(yīng)該是一個(gè)const類型的int_proxy對(duì)象,然而如果它發(fā)現(xiàn)參數(shù)不是該對(duì)象時(shí),就會(huì)使用該類中可以使用該參數(shù)進(jìn)行構(gòu)造對(duì)象的方法構(gòu)造出一個(gè)臨時(shí)的對(duì)象。我們例子中傳參100是個(gè)int型數(shù)據(jù),而int_proxy正好有一個(gè)攜帶int參數(shù)的構(gòu)造函數(shù)。稍微總結(jié)下類構(gòu)造函數(shù)隱式轉(zhuǎn)換的必要條件:

找不到傳參類型嚴(yán)格對(duì)應(yīng)的函數(shù)找到傳參類型嚴(yán)格匹配的類的構(gòu)造函數(shù)因?yàn)殡[式轉(zhuǎn)換構(gòu)造出的是臨時(shí)對(duì)象,所以不可修改,故觸發(fā)隱式轉(zhuǎn)換的函數(shù)的傳參類型必須要使用const修飾        但是個(gè)人覺(jué)得這種“奇巧淫技”還是不用為好。比如我們代碼中還有如下函數(shù):

void test_int_proxy(const int& v) {    printf("%d", v + 100);}        那么C++編譯器會(huì)針對(duì)傳100的調(diào)用上面這個(gè)過(guò)程。這樣一個(gè)函數(shù)調(diào)用有兩個(gè)匹配的調(diào)用方法就會(huì)產(chǎn)生不確定性——這兒指的不確定性并非是指編譯器調(diào)用哪個(gè)方法的不確定性,而是指維護(hù)這段代碼的人對(duì)上述代碼做調(diào)整時(shí)容易忽略一些問(wèn)題而導(dǎo)致的“人禍”。

        再比如,我們?cè)诖a中加入下面類和方法

class int_proxy_2 {public:    int_proxy_2(int n) : _m(n) {};public:    int value() const {        return _m + 100;    }private:    int _m;};void test_int_proxy(const int_proxy_2& v) {    printf("%d", v.value());}        那么編譯器不能確定隱式轉(zhuǎn)換是要轉(zhuǎn)換哪個(gè)類,更不知道是調(diào)用哪個(gè)test_int_proxy方法了。        限制類構(gòu)造函數(shù)的隱式轉(zhuǎn)換的方法也很簡(jiǎn)單,就是給對(duì)應(yīng)的構(gòu)造函數(shù)加上explict關(guān)鍵字
class int_proxy {public:    explicit int_proxy(int n) : _m(n) {};        這樣通過(guò)隱式轉(zhuǎn)換而構(gòu)造臨時(shí)對(duì)象的圖謀將會(huì)被察覺(jué)并禁止。


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 保德县| 牙克石市| 湟源县| 彰化市| 舞阳县| 勃利县| 抚松县| 白山市| 小金县| 崇明县| 洛扎县| 巨鹿县| 宜黄县| 信丰县| 从化市| 南宫市| 新营市| 贺兰县| 万荣县| 五家渠市| 兰坪| 香格里拉县| 湘阴县| 柳河县| 台江县| 永丰县| 翁源县| 延安市| 上思县| 辛集市| 龙口市| 修水县| 灵璧县| 方城县| 新乐市| 格尔木市| 九龙城区| 青河县| 颍上县| 广南县| 海伦市|