C++_変換演算子_static_cast

1972 ワード

static_キャストの役割:
前提:交換する2つのタイプは、関連するタイプであり、マルチステートではない必要があります.
(1)非多態クラス階層における子孫オブジェクトポインタまたは参照の交換
(2)空のポインタと他のタイプのポインタの呼び出し
(3)基本データ型間の変換
すなわち、非多態クラス階層間および基本データ型間の変換
注意:
(0) static_castでstaticはタイプ変換時にdynamicに対応するコンパイル時に行われることを示す.
(1) static_キャストはconst、volatile、または__を変換できません.unalignedプロパティ
(2) static_castはコンパイル中に変換し、コンパイル時のタイプチェックがあり、元のタイプとターゲットタイプが変換できるかどうかをチェックし、できない場合はエラーを報告します.
(3) static_castは単純で乱暴な変換を行い,実行時タイプチェックを行わずに変換の安全性を保証した.
(4)継承関係のあるオブジェクト間での変換はなるべくstatic_を使わないcastでdynamic_を使うcast
(5)static_castがマルチステートが存在するオブジェクト間で作用する場合、子から親への変換は安全ですが、親から子への変換は安全ではありません.
static_castの構文:
static_cast<type-id>(expression)

説明:
(1) type_idはターゲットタイプと同じです
(2) type_idとターゲットタイプは参照またはポインタです.例:
#include <iostream>
using namespace std;

class Base
{
public:
	void BaseAAA()
	{
		cout<<"BaseAAA"<<endl;
	}

	void AAA()
	{
		cout<<"Base::AAA"<<endl;
	}
};

class Derived : public Base
{
public:
	void DerivedAAA()
	{
		cout<<"DerivedAAA"<<endl;
	}

	void AAA()
	{
		cout<<"Derived::AAA"<<endl;
	}
};


int main()
{
	
	Derived* pDerived = new Derived;

	Base* pBase = static_cast<Base*>(pDerived); //        
	pBase->AAA();     //Base::AAA
	pBase->BaseAAA(); //BaseAAA

	pDerived = static_cast<Derived*>(pBase);  //        
	pDerived->AAA();       //Derived::AAA
	pDerived->BaseAAA();   //BaseAAA
	pDerived->DerivedAAA();//DerivedAAA

	void* pVoid = static_cast<void*>(pDerived);//            
	pDerived = static_cast<Derived*>(pVoid);
	pDerived->AAA();       //Derived::AAA
	pDerived->BaseAAA();   //BaseAAA
	pDerived->DerivedAAA();//DerivedAAA
	
	double dNum = 1.256; //             
	int nNum = static_cast<int>(dNum);
	cout<<nNum<<endl; //1

	system("pause");
	return 1;
}