close

語法(Syntax) :

static_cast < new_type > ( expression )

Returns a value of type new_type.

 

1.  可用在很多種情況 但是無法去除(constness or volatility. ),最常見的是implicit conversition
例如將float 轉型成 int
 
int main()
{
	//  initializing conversion
	int n = static_cast<int>(3.14);
	std::cout << "n = " << n << '\n';
   
    // 一般來說,我們通常都會直接偷懶,寫成這樣
    // int n = (int)3.14;

	std::vector<int> v = static_cast<std::vector<int>>(10);
	std::cout << "v.size() = " << v.size() << '\n';

	system("PAUSE");
}
 
輸出:
n = 3 
v.size() = 10
 
 2.  Downcast: 向下轉型
這樣的需求在C++開發當中常常需要用到,但是必須要特別注意,若使用static_cast則於runtime期間並不會自行做檢查,必須仰賴開法者自行處理(參考static polymorphism),所以是可能發生致命錯誤哦,一般都會建議使用比較安全的 dynamic_cast 作法來進行downcast 。
#include <iostream>

struct CShape {
	int m = 0;
	void hello() const {
		std::cout << "Hello world, this is CShape!\n";
	}
};
struct CCircle : CShape {
	void hello() const {
		std::cout << "Hello world, this is CCircle!\n";
	}
};

int main()
{
	// static downcast
	CShape shape;
	CShape& rshape = shape; // upcast via implicit conversion
	rshape.hello();
	CCircle& another_Circle = static_cast<CCircle&>(rshape); // downcast
	another_Circle.hello();

	system("PAUSE");
}
輸出:
Hello world, this is CShape!
Hello world, this is CCircle!
 
 
3.  轉換 lvalue-to-rvalue, array-to-pointer, or function-to-pointer
struct B {
	int m = 0;
	void hello() const {
		std::cout << "Hello world, this is B!\n";
	}
};
struct D : B {
	void hello() const {
		std::cout << "Hello world, this is D!\n";
	}
};

int main()
{
	//array - to - pointer followed by upcast
	D a[10];
	B* dp = static_cast<B*>(a);

	system("PAUSE");
}
 
 
4. 轉換 scoped enum 為 int 或是 float
enum class E { ONE = 1, TWO, THREE };
enum EU { ONE = 1, TWO, THREE };
  
int main()
{
	E e = E::ONE;
	int one = static_cast<int>(e);
	std::cout << one << '\n';

	// int to enum, enum to another enum
	E e2 = static_cast<E>(one);
	EU eu = static_cast<EU>(e2);

	system("PAUSE");
}
 
 
arrow
arrow
    文章標籤
    C++ static_cast
    全站熱搜

    Chris 發表在 痞客邦 留言(0) 人氣()