[英]Is there a default explicit conversion function for user-defined class (c++)?
我可以轉換兼容的非指針對象而不實際定義強制轉換操作符嗎? 所以如果B繼承自A:
A a;
B b;
如果我不提供自己的演員,會(A)b
編譯嗎?
編輯:似乎編譯。 是因為存在默認的轉換轉換運算符,或者編譯器是否識別兼容性並在分配中使用默認的復制構造函數或賦值運算符?
是的,它確實編譯( http://ideone.com/CXbeh0 )
默認情況下, A
是可復制的。 復制構造函數具有簽名A::A(A const &)
。 由於B
實例可隱式轉換為A const &
,因此將使用A
的復制構造函數解析轉換。
轉換為引用也適用於(也是隱式生成的)復制賦值運算符,因此a = b
再次使用A &A::operator=(A const &)
編譯。
請記住,新對象是A類型而不是B類,因此它不包含B的原始實例所做的任何其他信息。 這很少是你想要的。
另外,在C ++中建議忘記C樣式轉換存在並使用更具體的C ++轉換類型:
static_cast
,僅適用於兼容類型。 dynamic_cast
。 const_cast
只處理const。 reinterpret_cast
如果你真的需要玩指針技巧,但要注意別名規則。 如果沒有定義用戶定義的構造函數或運算符,則:
(A)b
將被實施,如果:
A(b) //Calls A copy-constructor: A::A(const A&)
也就是說,它將從參數創建一個臨時的復制構造。
這稱為對象拼接 ,這通常是一個壞主意,因為您正在復制B的某些字段,而不是其他字段。 因人而異。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.