[語法] expicit關鍵字

看板C_and_CPP (C/C++)作者 (累人啊....)時間15年前 (2010/08/09 11:58), 編輯推噓4(4014)
留言18則, 3人參與, 最新討論串1/1
請問,我在書上看到這一段,但不是很懂 class Cube{ public: double side; Cube(double side); double volume(); //計算Cube面積 bool compareVolume(Cube aCube); //比較兩個面積大小 } 然後 Cube box1(5.0); if (box1.compareVolume(50.0)){ cout<<"a"; } else{ cout<<"b";} (原本是要box1與體積50.0的Cube作比較) 書上說box1.compareVolume(50.0)執行時會等同於 box1.compareVolume(Cube(50.0)) (實際是box1與體積125000.0的Cube作比較) 為避免此問題,需要在Cube constructor加上explicit關鍵字 不是很懂的是為何執行時它會自己作轉換? compareVolume的參數型態為Cube,但傳入的50.0為double 我所認知的是,應該在compile時便會因型態不同而出錯了 書上說已提供constructor可將引數50.0轉為Cube物件 這地方不是很懂,煩請說明一下,謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 163.18.48.14

08/09 12:08, , 1F
c++會隱性(implicit)轉換 自動搜尋符合的constructor
08/09 12:08, 1F

08/09 12:08, , 2F
雖然我也覺得這種寫法怪怪的 但這是可以跑的
08/09 12:08, 2F

08/09 12:24, , 3F
就像C++ Coding Standard Ch40 介紹的, 單引數的建構
08/09 12:24, 3F

08/09 12:25, , 4F
子最好還是加上 explicit, 不過讓編譯器可以自己轉型
08/09 12:25, 4F

08/09 12:26, , 5F
也是有好處的, 像 std::string 你應該不想每次都寫
08/09 12:26, 5F

08/09 12:34, , 6F
w大,我目前就是不太懂他找到的constructor為何是符合的
08/09 12:34, 6F

08/09 12:35, , 7F
l大,請問這跟單引數又有什麼關係呢??
08/09 12:35, 7F

08/09 12:52, , 8F
不好意思這例子舉不太好 = __ =, std::string 超暴力
08/09 12:52, 8F

08/09 12:55, , 9F
單引數的建構子跟operator都是提供編譯器隱含轉型的方
08/09 12:55, 9F

08/09 12:55, , 10F
08/09 12:55, 10F

08/09 13:06, , 11F
因為你設constructor可以接double不是嗎 先不看compare那個
08/09 13:06, 11F

08/09 13:06, , 12F
補充一點, 編譯器會想辦法讓你的呼叫合法, 因為從50.0
08/09 13:06, 12F

08/09 13:06, , 13F
直接Cube box1 = 5.0也是可以的
08/09 13:06, 13F

08/09 13:07, , 14F
生出Cube是可以的, 所以編譯器會幫你生來達成這個函
08/09 13:07, 14F

08/09 13:09, , 15F
式呼叫, 不過這樣的轉型動作只限一次, 或者你compare
08/09 13:09, 15F

08/09 13:10, , 16F
的參數型態可以改成 Cube&, 這樣就會不合法, 因為編譯
08/09 13:10, 16F

08/09 13:10, , 17F
器轉出來的是右值(r-value)
08/09 13:10, 17F

08/09 13:23, , 18F
我想我大概懂了...謝謝兩位
08/09 13:23, 18F
文章代碼(AID): #1CNtpj7R (C_and_CPP)
文章代碼(AID): #1CNtpj7R (C_and_CPP)