是否有可能以及爲什麼要這樣做?用戶定義類型的static_cast
class Foo;
class Bar;
......
Foo foo;
Bar bar = static_cast<Bar>(foo);
通常的static_cast使用具有數字類型和指針,但它可以與用戶定義的數據類型的工作,a.k.a類?
是否有可能以及爲什麼要這樣做?用戶定義類型的static_cast
class Foo;
class Bar;
......
Foo foo;
Bar bar = static_cast<Bar>(foo);
通常的static_cast使用具有數字類型和指針,但它可以與用戶定義的數據類型的工作,a.k.a類?
Bar bar = static_cast<Bar>(foo);
此演員表將失敗。 Foo
和Bar
是不兼容的類型,除非下面的ATLEAST之一爲真:
Foo
從Bar
衍生,或者Bar
具有一個構造函數Foo
或Foo
具有用戶定義轉換爲Bar
。這裏更大的問題不在於它是否會成功投射。更大的和實際的問題應該是:你想從這樣的演員中得到什麼?爲什麼你想首先做這樣的事情?它應該做什麼?我的意思是,Bar
對象將如何從Foo
對象初始化?
明智的方法來轉換一個類型到另一個是通過以下方式之一:
要麼定義Foo
爲:
class Foo : public Bar
{
//...
};
或定義Bar
爲:
class Bar
{
public:
Bar(const Foo &foo); //define this constructor in Bar!
};
或提供Foo
中的轉換函數爲:
class Foo
{
public:
operator Bar(); //provide a conversion function Foo to Bar!
};
這裏的規則:
表達static_cast<T>(e)
是有效的,當且僅當下面的變量定義是有效的
T x(e);
其中x
一些發明變量。
所以,一般來說,兩個不相關的類型不能互相轉換。但是,如果一個類型是從另一個類型派生的,或者當一個類型定義了另一個類型的轉換函數,或者具有構造函數時只接受另一個類型的單個參數 - 在這些情況下,static_cast將會被明確定義。
它有沒有道理?例如,如果T定義了一個構造函數,該構造函數使用單個U並且構造函數爲explicit
,那麼static_cast<T>(e)
其中e是U類型,這會非常有意義
它在通用代碼中特別有意義,例如,如果T可以是用戶定義類型,也可以是內置類型。那麼如果你寫了'(T(e))'而不是'static_cast
是的,它可以工作,但您也必須知道如何使用它 - 這裏是每個演員在C++中做什麼的開始:http://stackoverflow.com/questions/332030/when-should-static-cast-dynamic-cast-and-reinterpret-cast-be-used – birryree