日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

C++?explicit關鍵字講解_C 語言

作者:龍小 ? 更新時間: 2022-03-16 編程語言

前言:

C++編碼時,可以通過構造函數將相應的數據類型轉換成為C++類的對象,從某種程度來說給編碼帶來了方便,但并不是每次都正確,為了避免這種情況,C++提供了explicit關鍵字,相對于implicit而言,他默認關閉了隱式類型轉換方法。至于兩者有什么區別,通過下面的代碼進行比較說明。

1 隱式轉換

C++ 構造函數默認類型為implicit,定義時既可以顯示說明也可以默認不加該標識符。

// 沒有使用explicit關鍵字的類聲明, 即默認為隱式聲明  
class CString{  
private:
    char *m_pStr;  
    int m_iSize; 
public: 
    CxString(int size){  
        m_iSize = size;
        m_pStr = malloc(m_iSize + 1);
        memset(m_pStr, 0, m_iSize + 1);  
    }  
    CxString(const char *p)  {  
        int size = strlen(p);  
        m_pStr = malloc(size + 1);
        strcpy(m_pStr, p);
        m_iSize = strlen(m_pStr);  
    }
    ~ CxString(){
        if(m_pStr)
        {
            delete m_pStr;
            m_pStr = nullptr;
        }
    }
};


如上的代碼中在實例化類的對象時以下方法都是正確的。

如下所示:

CString str1("12121");//CxString(const char *p)  
CString str2="abc";//CxString(const char *p)
CString str4(4);//CxString(int size) 
CString str5=6;//CxString(int size)


上面的使用方式都會默認調用相應的構造函數實現對象的初始化,以CString str5=6為例,在對對象進行實例化的過程中主要進行了如下操作:

CString string5(6); 
//或者如下所示 
CString temp(6);  
CString string5 = temp; 


2 顯示轉換

在構造函數上使用了explicit關鍵字后,通過構造函數進行對象實例化時需要進行顯示類型轉化。否則將會報錯。

依舊以上面的代碼為例:

class CString{  
private:
    char *m_pStr;  
    int m_iSize; 
public: 
    explicit CString(int size) {  
        m_iSize = size;
        m_pStr = (char *)malloc(m_iSize + 1);
        memset(m_pStr, 0, m_iSize + 1);  
    }  
    explicit CString(const char *p){  
        int size = strlen(p);  
        m_pStr = (char *)malloc(size + 1);
        strcpy(m_pStr, p);
        m_iSize = strlen(m_pStr);  
    }
};


如上:再次使用相同得到方式對類進行實例化時將會報錯,報錯內容如下:

通過運行結果可以說明:explicit關鍵字可以防止構造函數進行隱式自動轉換

3 再次拆解

explicit關鍵字只對構造函數有一個參數的形式有效,如果構造函數有多個參數時explicit的功能也將失效,但是C++也提供了一種例外,既如果構造函數的其他參數都有默認值及時參數個數大于1個explicit也是生效的。

如下面的代碼所示:

class CPoint
{  
private:
    float m_fX;  
    float m_fY; 
public: 
    explicit CPoint(float x,float y=9.8):m_fX(x),m_fY(y) 
    {  
        
    }  
};  
int main()
{
    CPoint point1(2,3);
    CPoint point2=4.5;
    return 0;
}


如代碼所示,編譯時將會報錯,報錯內容為:

如果要解決上面的問題可以用下面得到方法:

按照顯示類型轉換的方式進行處理,如:

 CPoint point1(2,3);
CPoint point2(4.5);


將explicit關鍵字去掉,允許構造函數進行隱式轉換數據類型,如:

CPoint(float x,float y=9.8):m_fX(x),m_fY(y) 
{          
}  

原文鏈接:https://mp.weixin.qq.com/s?__biz=MjM5ODg5MDIzOQ==&mid=2650491413&idx=1&sn=93875c0985fbe8c6c1d9bbd7ee

欄目分類
最近更新