C ++ _ note_8_型変換

免責事項:この記事はブロガーオリジナル記事ですが、智ギ盛転送ブロガーに従ってください。https://blog.csdn.net/Ga4ra/article/details/89792622

9. C ++のキャスト

Cは、唯一のキャスト(出演者)をサポートしていますTYPE a = (TYPE)a;

C ++変換演算子の4つのスタイルをサポートしています。

  • static_cast
  • reinterpret_castキャストと同等の再解釈タイプ、
  • dynamic_castサブクラスとスーパー変換の間にマルチステートタイプ
  • const_castすなわち変換定数特性

最初の2人のキャストに対応するC。

フォーマット例:int a = static_cast<int>(b);

私たちは、型変換を利用するのは避けるべきです。

static_cast

などの基本データ型、の間の変換intへの変換char、コンパイラの型チェック。

int a = 3.14このようなCスタイルの暗黙的な変換は、警告が表示されます; int a = static_cast<int>(3.14)ありません。

暗黙的な変換を置くことができるものは何でも使用することができますstatic_cast

しかし、静的変換器は、次のような指標の異なるタイプの間の変換をサポートしていませんint*にしますchar *reinterpret_castそれはサポートしています。

reinterpret_castは

これは、変換することができる任意の他の組み込みデータ型のいずれかの最後は本当にない、データ型ではありません

dynamic_castを

実行時の型チェックは、他の三つがコンパイルされて完了することができます。

使用時には、基底クラスの仮想関数を持っている必要があります。

#include<iostream>
using namespace std;

class Person
{
public:
	virtual void come() = 0;
};

class Worker : public Person
{
public:
	virtual void come()
	{
		cout<<"clock in."<<endl;
	}
	
	void work()
	{
		cout<<"work."<<endl;
	}
};

class Boss : public Person
{
public:
	virtual void come()
	{
		cout<<"check."<<endl;
	}
	void rest()
	{
		cout<<"rest."<<endl;
	}
};

void func(Person *p)
{
	p->come();
	
	Worker * pworker = dynamic_cast<Worker *>(p);
	if(pworker != NULL)
	{
		pworker->work();
	}
	
	Boss * pboss = dynamic_cast<Boss *>(p);
	if(pboss != NULL)
	{
		pboss->rest();
	} 
}

int main(int argc, char *argv[])
{
	Worker worker;
	Boss boss;
	func(&worker);
	func(&boss);
	
	cin.get();
	return 0;
}
/*
clock in.
work.
check.
rest.
*/

ときにアップキャスト、dynamic_castおよびstatic_cast効果は同じです。

ときにダウンキャスト、dynamic_castそれはより型チェックの機能を持っているstatic_castより安全に。成功した変換は、クラスリファレンスへのポインタを返すか、失敗NULLが返されます。

Person *pp = static_cast<Person*>(&boss);

const_cast

作るために、実際には不可能であるconstにデータの種類をconstタイプ、またはconst属性を除去しました。

読み取り専用このメモリを書き込むことができることを確認するために、書き込みに変換されます。

#include<iostream>
using namespace std;

void func(const char *s)
{
	char *p = const_cast<char*>(s);
	p[0] = 'A';
}

int main(int argc, char *argv[])
{
	char s[] = "abc";
    //char *s = "abc";
	func(s);
	printf("%s\n",s);
	cin.get();
	return 0;
}

おすすめ

転載: blog.csdn.net/Ga4ra/article/details/89792622