C++編で扱っている C++ は 2003年に登場した C++03
という、とても古いバージョンのものです。C++ はその後、C++11 -> C++14
-> C++17 -> C++20 -> C++23 と更新されています。
なかでも C++11 での更新は非常に大きなものであり、これから C++
の学習を始めるのなら、C++11
よりも古いバージョンを対象にするべきではありません。特に事情がないなら、新しい
C++ を学んでください。 当サイトでは、C++14 をベースにした新C++編を作成中です。
問題① 次の各変換は、static_cast、const_cast、reinterpret_cast、C言語形式のキャスト、キャストは不要、のいずれで行えるか答えてください。
キャストは不要です。true なら 1 に、false なら 0 になります。
reinterpret_cast か、C言語形式のキャストが使えます。C++ では reinterpret_cast を使いましょう。
const_cast か、C言語形式のキャストが使えます。C++ では const_cast を使いましょう。
あるポインタ型から void*型へは、暗黙的に変換できますから、キャストは不要です。
const修飾子を付ける方向へは、暗黙的に変換できますから、キャストは不要です。
static_cast、reinterpret_cast、C言語形式のキャストのいずれでも可能です。C++ では static_cast を使いましょう。
C言語形式のキャストを使えば一気に変換できますが、C++ では static_cast と const_cast を併用して書くべきです。
int* p2 = static_cast<int*>(static_cast<void*>(const_cast<float*>(f)));
reinterpret_cast か、C言語形式のキャストが使えます。C++ では static_cast を使いましょう。
書き方が分かりにくいので、例を挙げておきます。
#include <iostream>
bool func(int a);
int main()
{
bool (*p1)(int) = func;
// bool (*p2)(const char*) = (bool (*)(const char*))p1;
bool (*p2)(const char*) = static_cast<bool (*)(const char*)>(static_cast<void*>(p1));
std::cout << p2("abc") << std::endl;
}
bool func(int a)
{
return true;
}
実際のところ、関数ポインタの型が必要ならば、typedef した別名を用意する方が良いでしょう。
#include <iostream>
typedef bool (*func_int)(int);
typedef bool (*func_cchar_ptr)(const char*);
bool func(int a);
int main()
{
= func;
func_int p1 // func_cchar_ptr p2 = (func_cchar_ptr)p1;
= static_cast<func_cchar_ptr>(static_cast<void*>(p1));
func_cchar_ptr p2
std::cout << p2("abc") << std::endl;
}
bool func(int a)
{
return true;
}
この例では、func関数内で引数a を使っていないので、特に何事もなく実行できますが、使っているようだと、int型の引数を想定している関数に、const char*型の値を渡すことになるので危険です。
ポインタ型同士のキャストについて、記述を改めた。
新規作成。
Programming Place Plus のトップページへ
はてなブックマーク に保存 | Pocket に保存 | Facebook でシェア |
X で ポスト/フォロー | LINE で送る | noteで書く |
RSS | 管理者情報 | プライバシーポリシー |