2011-06-07 29 views

回答

12

任何時候創建一個新對象,都會調用一個構造函數。 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()將被調用)

+2

「一個'static_cast'總是導致一個新的臨時對象」不正確。舉個例子,給定類層次結構'struct B {}; struct D:B {};',以下'static_cast'不會創建新對象:'D d; B&b(static_cast (d));'。目標類型是對象類型的任何'static_cast'都會創建一個新的對象。 – 2011-06-07 16:19:33

+0

@James是的,我應該更加精確。我在考慮類的類型(因爲涉及的問題構造函數);事實上,規則很簡單(並且對於所有類型轉換都是一樣的):如果結果是引用,則不存在新對象;否則存在(根據標準,類型轉換的結果當且僅當轉換爲參考類型時,它是一個左值。) – 2011-06-08 07:23:15

4

如果有一個合適的轉換構造函數轉換構造函數將被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); 
+0

什麼如果構造是明確的。?我認爲它仍然會被調用。 – Mankarse 2011-06-07 05:50:49

+0

@Mankarse:是的,'explicit'表示如果沒有指定類型,就不能調用它。當你指定類型時,它將被調用。 – sharptooth 2011-06-07 05:58:11

11

無論何時創建該類型的新實例,都會調用類類型的構造函數。如果演員創建該類類型的新對象,則調用構造函數。重載解析決定了給定特定參數的哪個類類型的構造函數被調用。

如果static_cast的目標類型是類類型,它將創建一個新的目標類型的對象。

A const_cast,dynamic_castreinterpret_cast永遠不會創建新的類類型對象,因此永遠不會調用構造函數。

由於C樣式轉換始終執行的static_castconst_castreinterpret_cast一些組合,它會創建一個static_cast將創建一個新的對象相同的情況下一個新的對象。

+1

這是正確的,但是當它創建一個新實例時,說*是很重要的。(IIRC函數樣式轉換總是會執行的,而靜態轉換會在超過cv-qualification時執行)。 – 2011-06-07 05:51:48

+0

當目標類型是類類型時,通過'static_cast'創建新類類型對象的唯一時間。我已經用這個細節更新了答案。 – 2011-06-07 05:57:57

+0

但我讀到 – 2011-06-07 06:11:38

相關問題