在C++中,explicit關鍵字主要用於防止隱式轉換,用於修飾構造函數、複製構造函數。函數
例若有一個類:spa
class A { public: A( int count ) : m_data( count ){} private: int m_data; }; int main() { A a = 0; //ok , conver int to A a = 10; // 這裏是什麼操做? 等價與 a.operator=( 10 ); }
一、 A a = 0;code
首先編譯器( compiler )認爲這樣寫是不符合規矩的,由於 A = A纔是正常行爲可是它不放棄,經過搜索發現A能夠根據一個int構造,同時這個A( int count)沒有用explicit修飾過。那麼A a=0編譯器將自動將整形轉爲A類對象,實際上等同下面操做對象
A temp( 0);blog
A a = temp;ci
這裏須要說明的是 A a = tmp 調用的是拷貝構造函數( copy constructor),雖然clas A中沒有,可是一般不寫的話,編譯器會生成一個成員逐一賦值( memberwise assignment )的拷貝構造函數,底層實現一般會以memcpy進行編譯器
二、a = 10;it
首先這裏同構造函數同樣,編譯器( compiler ) 沒法進行直接操做,等同於代碼編譯
a.operator=( 10 );class
須要注意的是, a = tmp是調用的賦值運算符( assignment操做 ), 同構造函數同樣,咱們本身不寫, 編譯器會生成一個成員逐一賦值(memberwise assignment)操做。
三、fun( A a )
一樣, fn(10)也是不對的, 可是"按照慣例", 會有:
A tmp(10);
fn( tmp ) ;
注意:拷貝構造函數的寫法只能是 T::T(const T &);
而賦值運算符的寫法能夠多變,即以任意T爲例:
能夠有
T &operator = (int n);
也可有
T &operator = (const char *);
固然, 你要確認如此的定義是對T而言有意義.