c/c++ explicit用法
阿新 • • 發佈:2017-11-04
自動 col 不能 程序 自己 c++ cnblogs xpl clas
試想一個類,它的構造函數只有一個參數,
1 class test 2 { 3 test( int a ) {}5 }
這時我想用一個int b = 10初始化它,這當然沒問題,但如果你用一個字符例如‘c‘初始化test類,會發現代碼成功編譯
1 test a = 12; //OK! 2 3 test b = ‘c‘; //also OK!
這時因為字符’c‘自動轉型為了一個int,這在c++中是可行的,一般來說,這種轉型是很方便的,因為你不需要刻意為了一個變量的類型而去用相應的關鍵字,但在某些情況下,程序員們不希望自己的類被一些“奇奇怪怪”的變量給初始化了,這很可能導致錯誤( 例如,12.4567轉化為int就變為12了)
所以我們就需要使用explicit了。
C++中的explicit關鍵字只能用於修飾只有一個參數的類構造函數, 它的作用是表明該構造函數是顯示的, 而非隱式的, 跟它相對應的另一個關鍵字是implicit, 意思是隱藏的,類構造函數默認情況下即聲明為implicit(隱式)
當構造函數被explicit修飾時,剛才的用’c‘初始化的類編譯器就會報錯了,因為explicit表示了你只希望用int而不是其他的什麽類型(哪怕它可以轉化為int)來初始化這個類。
explicit關鍵字只對有一個參數的類構造函數有效, 如果類構造函數參數大於或等於兩個時, 是不會產生隱式轉換的, 所以explicit關鍵字也就無效了
這種情況下,加不加explicit效果是一樣的,當然這也有例外,構造函數除了第一個參數外剩下參數都有默認值時,explicit仍然有用
1 int main() 2 { 3 class test 4 { 5 test( int a, int b, int c ) { } 6 //加不加explicit都一樣,多參數情況自動不允許隱式轉化 7 }; 8 9 class test_2 10 { 11 explicit test_2( int a, int b = 0, int c = 0) { } 12 //當構造函數只傳入一個參數時,explicit仍能保證其不能隱式轉化 13 }; 14 }
c/c++ explicit用法