「C++の基礎 - キャスト」の版間の差分
ナビゲーションに移動
検索に移動
細 (文字列「</source>」を「</syntaxhighlight>」に置換) |
細 (文字列「__FORCETOC__」を「{{#seo: |title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki |keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,Electric Circuit,Electric,pcb,Mathematics,AVR,TI,STMicro,AVR,ATmega,MSP430,STM,Arduino,Xilinx,FPGA,Verilog,HDL,PinePhone,Pine Phone,Raspberry,Raspberry Pi,C,C++,C#,Qt,Qml,MFC,Shell,Bash,Zsh,Fish,SUSE,SLE,Suse Enterprise,Suse Linux,openSUSE,open SUSE,Leap,Linux,uCLnux,Podman,電気回路,電子回路,基板,プリント基板 |description={{PAGENAME}} - 電子回路とSUSE Linuxに関する情報 | This pag…) |
||
55行目: | 55行目: | ||
互換性の問題でどうしても使わざるを得ない場合以外では使うべきではない。<br> | 互換性の問題でどうしても使わざるを得ない場合以外では使うべきではない。<br> | ||
<br><br> | <br><br> | ||
{{#seo: | |||
|title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki | |||
|keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,Electric Circuit,Electric,pcb,Mathematics,AVR,TI,STMicro,AVR,ATmega,MSP430,STM,Arduino,Xilinx,FPGA,Verilog,HDL,PinePhone,Pine Phone,Raspberry,Raspberry Pi,C,C++,C#,Qt,Qml,MFC,Shell,Bash,Zsh,Fish,SUSE,SLE,Suse Enterprise,Suse Linux,openSUSE,open SUSE,Leap,Linux,uCLnux,Podman,電気回路,電子回路,基板,プリント基板 | |||
|description={{PAGENAME}} - 電子回路とSUSE Linuxに関する情報 | This page is {{PAGENAME}} in our wiki about electronic circuits and SUSE Linux | |||
|image=/resources/assets/MochiuLogo_Single_Blue.png | |||
}} | |||
__FORCETOC__ | __FORCETOC__ | ||
[[カテゴリ:C++]] | [[カテゴリ:C++]] |
2024年10月14日 (月) 10:42時点における最新版
static_cast
ある型からある型への暗黙の変換が存在する時(例 : int型からdouble型へ変換)、そこで暗黙の変換が行われることを明示する場合に使用する。
double d = 3.14;
int i = static_cast<int>(d);
dynamic_cast
親クラスのポインタを子クラスのポインタにキャストする時に使用する。
その際、その親クラスのポインタが指すオブジェクトの実体が、キャスト先のクラスであることを確認する。
ポインタが指す実体が、キャスト先のクラスまたはその子孫クラスである場合はポインタはそのまま使われるが、
キャスト先のクラスとして使用できない場合には、NULL(nullptr)に置き換えられる。
Child0 child00;
Parent* parent = &child0;
// Child1* child1 = parent; <- コンパイルエラー
// child1はchild1にキャストされる
Child1* child01 = dynamic_cast<Child1*>(parent);
std::cout << "child1 : " << child1 << std::endl;
std::cout << "child1->name() : " << child1->name() << std::endl;
// child2はnullptrとなる
Child2* child2 = dynamic_cast<Child2*>(parent);
std::cout << "child2 : " << child2 << std::endl;
dynamic_castを行うためには、型情報がポインタから得られる必要がある。
つまり、クラスはポリモーフィックである必要がある。
親クラスは最低でも1つのvirtualな関数が親クラスに定義されていて、vtableが存在しなくてはならない。
reinterpret_cast
ポインタ型を他のポインタ型に強制的に変換する。
dynamic_castと違うのは、ポインタの型変換が安全に行えるかは考慮されない。
また、整数型(int、long、long long等)を任意の型のポインタに変換するのにも利用できる。
int i;
char *c = reinterpret_cast<char*>(&i);
c[0] = 1;
c[1] = 1;
// 257 in little-endian.
std::cout << "i : " << i << std::endl;
long addrint = reinterpret_cast<long>(c);
std::cout << "addrint : " << addrint << std::endl;
const_cast
constを付加するまたは外す時に使用する。
C++ではconst_castを使用してconstを外すことができるが、constは変数を定数として扱うことを表しているので、解除するのは問題がある。
互換性の問題でどうしても使わざるを得ない場合以外では使うべきではない。