簡體   English   中英

用戶定義的類(c ++)是否有默認的顯式轉換函數?

[英]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 ,僅適用於兼容類型。
  • 帶有運行時檢查的upcasting指針/引用的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM