C++ explicit關鍵字用來修飾類的構造函數,代表該構造函數是顯式的,既然有"顯式"那麼必然就有"隱式",那麼什麼是顯示而什麼又是隱式的呢?c++
若是c++類的構造函數有一個參數,那麼在編譯的時候就會有一個缺省的轉換操做:將該構造函數對應數據類型的數據轉換爲該類對象,以下面所示:函數
1 #include "stdafx.h" 2 3 class A 4 { 5 public: 6 A(int n) {m = n;} 7 private: 8 int m; 9 }; 10 11 int _tmain(int argc, _TCHAR* argv[]) 12 { 13 A a = 10; 14 return 0; 15 }
在上面的代碼中編譯器自動將整型轉換爲A類對象,實際上等同於下面的操做:spa
#include "stdafx.h" class A { public: A(int n) {m = n;} private: int m; }; int _tmain(int argc, _TCHAR* argv[]) { A temp(10); A a = temp; return 0; }
上面的操做便是所謂的"隱式轉換"。code
若是要避免這種自動轉換的功能,咱們該怎麼作呢?這就是關鍵字explicit的做用了,將類的構造函數聲明爲"顯式",也就是在聲明構造函數的時候前面添加上explicit便可,這樣就能夠防止這種自動的轉換操做,若是咱們修改上面的A類的構造函數爲顯式的,那麼下面的代碼就不可以編譯經過了,以下所示:對象
#include "stdafx.h" class A { public: explicit A(int n) {m = n;} private: int m; }; int _tmain(int argc, _TCHAR* argv[]) { A a = 10; return 0; }
error C2440: 'initializing' : cannot convert from 'int' to 'A' blog
Constructor for class 'A' is declared 'explicit'ci