首先是定義:
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防止了類構造函數的隐式自動轉換)
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISPrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdsATOfd3bkFGazxCMx8VesATMfhHLlN3XnxCMwEzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5yMhFDNilDN0M2M1MmMzYWO5QTMxMzYkhjMihTY5QjMk9CXwMzLcNDMwIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjL0M3Lc9CX6MHc0RHaiojIsJye.png)
(此時編譯就會出錯)
class AMD{
public:
explicit AMD(int level,int size=0....){ //除了第一個參數都有預設值
.....
}
.....
}