採用C++進行程序開發的過程中,難免會遇到各種各樣莫名其妙的問題,而有些問題只有了解了其用法和原理之後,才能避免在工作中犯錯誤。
本文將要講解的C++兩種隱式類型轉換,如果不了解其用法,那麼遇到問題的時候,可能就會陷入困境。
所以接下來就來講解operator與構造函數的隱式類型轉換,首先通過例子說明operator的隱式類型轉換,再說明構造函數的隱式類型轉換,最後再總結它們之間的區別。
一、 operator隱式類型轉換
operator除了操作符的重載之外,還有隱式類型轉換的功能。operator隱式類型轉換是指隱式將當前對象生成其他類型的對象。
為了說明operator的隱式類型轉換,首先實現ObjectA對象, 形如operator int的聲明即為operator的隱式類型,而轉換的類型為整型int。
1、主程序輸入如下代碼段,先創建ObjectA類型的對象objA,然後將該對象變量objA與整型數字4相加。
2、從 調試運行輸出的結果看,ObjA雖然不是int類型,但是與整數類型4進行相加的時候,會調用到operator int函數,該函數返回的結果是int類型
二、構造函數的隱式類型轉換
構造函數的隱式類型轉換,是用其他類型來構造當前類型的臨時對象。
為了說明構造函數的隱式類型轉換,需要實現ObjectB類,該類實現了一個無參數構造函數、一個參數類型為ObjectA的構造函數,一個析構函數和列印函數,注意入參類型是ObjectB。
1、主程序中輸入如下代碼段, 創建ObjectA類型的對象objA,主要用於說明後面構造函數隱式類型的轉換,接著創建ObjectB類型的對象objB,最後調用該對象的列印函數print,但是入參類型為ObjectA。
2、 從調試運行輸出結果看,print函數聲明的入參類型是ObjectB, 但是傳遞的類型是ObjectA,但是由於ObjectB有單一形參類型為ObjectA的構造函數,程序會隱式地將objA轉換為ObjectB(objA)
3、 如果想禁用構造函數的隱式類型轉換,那麼構造函數前添加explicit 即可,例如:
三、總結
本文主要通過例子講解了opertor隱式類型與構造函數隱式類型的用法,C++提供了這樣的機制,必然有其合理性,正所謂存在即合理,但是,開發過程中,如果不注意的話,也會帶來很多不必要的麻煩,因此,對其有一個整體的概念的理解,能夠在開發過程中,給予一個警惕的作用。最後再來梳理下兩種隱式類型轉換的區別。
operator的隱式類型轉換是將當前對象生成其他類型的對象。構造函數的隱式類型轉換,是用其他類型來構造當前類型的臨時對象operator的隱式類型轉換與構造函數的隱式類型轉換是相反的。