天天看點

C++ 關鍵字 explicit 的使用

首先是定義:

explicit關鍵字隻能修飾隻有一個參數的構造函數,或者有多個參數,但是除第一個參數外其他的參數都有預設值的構造函數。它的作用是表明構造函數是顯式方式顯示的。(類構造函數預設為隐式)

如果類構造函數參數大于或等于兩個時, 是不會産生隐式轉換的, 是以explicit關鍵字也就無效了

舉個例子:

class AMD{
public:
    AMD(int level){  //這裡的構造函數預設就是隐式聲明
        .....
        }
.....
}           

在這種情況下,如果運作以下語句:

AMD a(3);
AMD b=10;           

這兩種都是沒有問題的,第二句 AMD b=10; 沒有問題的原因是:

C++中, 如果的構造函數隻有一個參數時, 那麼在編譯的時候就會有一個預設的轉換操作:将該構造函數對應資料類型的資料轉換為該類對象.

也就是說 AMD b=10 在實際執行時操作等同于以下語句:

AMD b(10);
//或者
AMD c(10);
AMD b = c;           

雖然解釋的通了,但是這種寫法仍然是不友好的,畢竟 AMD b=10 這種寫法看上去就像是将整數指派給對象,顯得不倫不類,而且在複雜代碼中容易讓人感到迷惑 -->是以現在就要使用到explicit關鍵字了

經過explicit修飾後:

class AMD{
public:
    explicit AMD(int level){  //修飾後構造函數就是顯式聲明
        .....
        }
.....
}           

此時,再去執行之前那兩條語句,

AMD a(3);依舊是沒什麼問題,但是 AMD b=10 就不再可行了(explicit防止了類構造函數的隐式自動轉換)

C++ 關鍵字 explicit 的使用

(此時編譯就會出錯)

class AMD{
public:
    explicit AMD(int level,int size=0....){  //除了第一個參數都有預設值
        .....
        }
.....
}           

繼續閱讀