深入理解c++中的explicitkeyword
kezunhai@gmail.com
c++中的explicitkeyword僅僅能用於
修飾僅僅有乙個引數
的類建構函式, 它的作用是表明該建構函式是顯示的, 而非隱式的, 跟它相相應的還有乙個keyword是implicit, 意思是隱藏的,類建構函式預設情況下即宣告為implicit(隱式)。
關於explicitkeyword。先看看msdn上的解釋:
. an explicit constructor cannot take part in implicit conversions. it canonly be used to explicitly construct an object。
從上面的解釋能夠看到。 explicitkeyword的作用:禁止隱式呼叫類內的單引數建構函式,這主要包含例如以下三層意思:
(1)該keyword僅僅能用來修飾類內部的建構函式
(2)禁止隱式呼叫拷貝建構函式
(3)禁止類物件之間的隱式轉換
首先,來看看隱式轉換,例如以下例:
class cexplict
cexplict(const cexplict& other)
friend void printexplicit(const cexplict& cx);
private:
bool is_explict;
};void printexplicit(const cexplict& cx)
cexplict(const cexplict& other)
friend void printexplicit(const cexplict& cx);
private:
bool is_explict;
};void printexplicit(const cexplict& cx)
至此,程式就能夠正常執行,並且進一步新增了程式的可讀性。
總結:
(1)explicitkeyword僅僅需用於類內的單引數建構函式前面。
因為無引數的建構函式和多引數的建構函式總是顯示呼叫,這樣的情況在建構函式前加explicit無意義。
(2)假設想禁止類a物件被隱式轉換為類b物件,可在類b中使用keywordexplicit,即定義這種轉換建構函式
google的c++規範中提到explicit的長處是能夠避免不合時宜的型別變換,缺點無。explicit b(a a)
explicit b(const a &a)
所以google約定全部單引數的建構函式都必須是顯示的,僅僅有極少數情況下拷貝建構函式能夠不宣告稱explicit。比如作為其它類的透明包裝器的類。
除非我有乙個好理由同意建構函式被用於隱式型別轉換,否則我會把它宣告為explicit,鼓舞大家遵循同樣的政策。
kezunhai
出處:
深入理解C語言 深入理解指標
關於指標,其是c語言的重點,c語言學的好壞,其實就是指標學的好壞。其實指標並不複雜,學習指標,要正確的理解指標。指標也是一種變數,占有記憶體空間,用來儲存記憶體位址 指標就是告訴編譯器,開闢4個位元組的儲存空間 32位系統 無論是幾級指標都是一樣的 p操作記憶體 在指標宣告時,號表示所宣告的變數為指...
深入理解C語言 深入理解指標
關於指標,其是c語言的重點,c語言學的好壞,其實就是指標學的好壞。其實指標並不複雜,學習指標,要正確的理解指標。指標也是一種變數,占有記憶體空間,用來儲存記憶體位址 指標就是告訴編譯器,開闢4個位元組的儲存空間 32位系統 無論是幾級指標都是一樣的 p操作記憶體 在指標宣告時,號表示所宣告的變數為指...
C 中深入理解dynamic cast
一 指標型別的dynamic cast 如果一條dynamic cast語句的轉換目標是指標型別並且轉換失敗了,會返回乙個空指標,則判斷條件為0,即為false 如果轉換成功,指標為非空,則判斷條件為非零,即true。這樣做可以確保型別轉換和條件檢查在同一條表示式中完成 if derived pd ...