確定一個特定的static_cast是否會調用一個類的構造函數的規則是什麼?如何C風格/功能風格演員?演員何時調用新類型的構造函數?
回答
任何時候創建一個新對象,都會調用一個構造函數。 A static_cast
總是會立即產生一個新的臨時對象(但請參閱James McNellis的評論),或者通過調用用戶定義的轉換來立即生成 。 (但是,在 以便具有所希望的類型的對象返回,用戶定義 轉換運算符將必須調用構造。)
當目標是一個類型,C風格管型和功能的風格 鑄件根據定義,只有一個參數與 static_cast
相同。如果功能樣式類型具有零個或多個 參數,則它將立即調用構造函數;用戶定義的 轉換運算符在這種情況下不被考慮。 (人們可以 值得注意的問題這是一個「類型轉換」的選擇。)
爲了記錄在案,一個在用戶定義的轉換操作符可以被 稱爲情況:
class A
{
int m_value;
public
A(int initialValue) : m_value(initialValue) {}
};
class B
{
int m_value;
public:
B(int initialValue) : m_value(initialValue) {}
operator A() const { return A(m_value); }
};
void f(A const& arg);
B someB;
f(static_cast<A>(arg));
在這種特殊情況下, ,演員陣容是不必要的,而轉換 將隱含在其缺席。但是,在所有情況下:隱 轉換,static_cast
,C風格的類型轉換((A) someB
)或功能 風格的轉換(A(someB)
), B::operator A()
將被調用)
如果有一個合適的轉換構造函數轉換構造函數將被static_cast
被稱爲:
class Class {
public:
Class(int); //<< conversion constructor
};
int what = 0;
Class object = static_cast<Class>(what);
同樣適用於C-風格轉換和「功能」鑄就。
int what = 0;
Class object = (Class)what;
int what = 0;
Class object = Class(what);
什麼如果構造是明確的。?我認爲它仍然會被調用。 – Mankarse 2011-06-07 05:50:49
@Mankarse:是的,'explicit'表示如果沒有指定類型,就不能調用它。當你指定類型時,它將被調用。 – sharptooth 2011-06-07 05:58:11
無論何時創建該類型的新實例,都會調用類類型的構造函數。如果演員創建該類類型的新對象,則調用構造函數。重載解析決定了給定特定參數的哪個類類型的構造函數被調用。
如果static_cast
的目標類型是類類型,它將創建一個新的目標類型的對象。
A const_cast
,dynamic_cast
或reinterpret_cast
永遠不會創建新的類類型對象,因此永遠不會調用構造函數。
由於C樣式轉換始終執行的static_cast
,const_cast
和reinterpret_cast
一些組合,它會創建一個static_cast
將創建一個新的對象相同的情況下一個新的對象。
這是正確的,但是當它創建一個新實例時,說*是很重要的。(IIRC函數樣式轉換總是會執行的,而靜態轉換會在超過cv-qualification時執行)。 – 2011-06-07 05:51:48
當目標類型是類類型時,通過'static_cast'創建新類類型對象的唯一時間。我已經用這個細節更新了答案。 – 2011-06-07 05:57:57
但我讀到 – 2011-06-07 06:11:38
- 1. 在構造函數中調用類成員的構造函數
- 2. 當使用新關鍵字時,模板類的構造函數調用類型構造函數
- 3. 當新操作員失敗時的構造函數調用
- 4. 如何在構造函數類擴展時從類調用構造函數?
- 5. 成員函數的類構造函數中調用
- 6. 調用一個新類型的構造函數
- 7. 如何調用類的構造泛型類型的構造
- 8. 在構造函數中調用不同類的構造函數?
- 9. 從不同類的構造函數調用構造函數
- 10. 調用構造函數時數據類型不正確
- 11. 成員構造函數和析構函數調用的順序
- 12. Java:如何調用子類構造函數內的超類構造函數?
- 13. 重載構造函數根據輸入類型調用其他構造函數
- 14. 調用類的成員對象的構造函數
- 15. 在父構造函數之前調用子類構造函數
- 16. Move構造函數調用基類移動構造函數
- 17. C#繼承:當我調用派生類構造函數時如何調用基類構造函數
- 18. C++何時會在類成員的對象上調用構造函數?
- 19. 如何調用Scala抽象類型的構造函數?
- 20. 構造函數調用兩次靜態類成員的增量
- 21. 類定義中的調用成員構造函數
- 22. 何時調用構造函數?
- 23. 何時調用構造函數?
- 24. 何時調用枚舉構造函數?
- 25. C++類的成員與構造函數
- 26. 類型...不是構造函數類型
- 27. 演員構造函數與路由器的參數
- 28. 類的類型和構造函數調用
- 29. 調用模板類的構造函數
- 30. 無法調用類的構造函數
「一個'static_cast'總是導致一個新的臨時對象」不正確。舉個例子,給定類層次結構'struct B {}; struct D:B {};',以下'static_cast'不會創建新對象:'D d; B&b(static_cast (d));'。目標類型是對象類型的任何'static_cast'都會創建一個新的對象。 – 2011-06-07 16:19:33
@James是的,我應該更加精確。我在考慮類的類型(因爲涉及的問題構造函數);事實上,規則很簡單(並且對於所有類型轉換都是一樣的):如果結果是引用,則不存在新對象;否則存在(根據標準,類型轉換的結果當且僅當轉換爲參考類型時,它是一個左值。) – 2011-06-08 07:23:15