1. 程式人生 > >c/c++ explicit用法

c/c++ explicit用法

自動 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用法