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;
}