ps:今天上午,非常鬱悶,有很多簡單基礎的問題搞得我有些迷茫,哎,碼代幾天不寫就忘。目前又不當coo,還是得用心記碼代哦!
在c++ primer 4th的第394講解了explicit這個關鍵字,面上就是我的學習心得。
按照認默定規,只有乙個引數的構造數函也定義了乙個隱式轉換,將該構造數函對應資料型別的資料轉換為該類象對,如面上所示:
class myclass
//.
myclass obj = 10; //ok,convert int to myclass
在面上的碼代中編譯器主動將整型轉換為myclass類象對,實際上等同於面上的作操:
myclass temp(10);
myclass obj = temp;
面上的有所的c++ explicit關鍵字相干的作操等於所謂的"隱式轉換"。
但是有的時候可能會不需要種這隱式轉換,如下:
class string
面上兩種寫法較比常正:
string s2 ( 10 ); //ok 分配10個節字的空字串
直接呼叫數函
string s3 = string ( 10 ); //ok 分配10個節字的空字串 直接呼叫數函
面上兩種寫法就較比惑疑了:
string s4 = 10; //編譯通過,也是分配10個節字的空字串
隱式轉換:string temp=string(10); string sv=temp
每日一道理
如果你們是藍天,我願做襯托的白雲;如果你們是鮮花,我願做陪伴的小草;如果你們是大樹,我願做點綴的綠葉……我真誠地希望我能成為你生活中乙個歡樂的音符,為你的每一分鐘帶去祝福。
string s5 = 『a』; //編譯通過,分配int(『a』)個節字的空字串
隱式轉換:string temp=string('a'); string sv=temp
s4 和s5 分別把乙個int型和char型,隱式轉換成了分配幹若節字的空字串,輕易人令誤會。
為了避免種這錯誤的生髮,我們可以宣告表現的轉換,應用explicit關鍵字:
class string
加上explicit,就克制了string ( int n )的隱式轉換,
面上兩種寫法仍然準確:
string s2 ( 10 ); //ok 分配10個節字的空字串
string s3 = string ( 10 ); //ok 分配10個節字的空字串
面上兩種寫法就不許允了:
string s4 = 10; //編譯不通過,不許允隱式的轉換
string s5 = 『a』; //編譯不通過,不許允隱式的轉換
因此,某些時候,explicit可以效有得避免構造數函的隱式轉換帶來的錯誤或者誤會
參考文獻:
C explicit關鍵字 禁止隱式轉換
explicit關鍵字是用來防止由建構函式定義的隱式轉換。要明白這個關鍵字的含義,首先我們要知道class型別的物件的隱式轉換 可以用單個實參來呼叫的建構函式定義了從形參型別到該類型別的乙個隱式轉換。比如 class somebody intcompareto const somebody othe...
C explicit關鍵字避免隱式轉換
explicit用來防止由建構函式定義的隱式轉換。要明白它的作用,首先要了解隱式轉換 可以用單個實參來呼叫的建構函式定義了從形參型別到該類型別的乙個隱式轉換。例如 1 class things23 1011 int compareto const things other 1213 std stri...
c explicit 關鍵字解析
c 提供了關鍵字explicit,可以阻止不應該允許的經過轉換建構函式進行的隱式轉換的發生。宣告為explicit的建構函式不能在隱式轉 換中使用。c 中,乙個引數的建構函式,承擔了兩個角色。1 是個構造器 2 是個預設且隱含的型別轉換操作符。所以,有時候在我們寫下如 aaa 這樣的 且恰好 的型別...