C++のstatic_castとは?基本からエラー例まで解説
static_castとは
static_castは、C++における通常の型変換(キャスト)を行うための演算子です。暗黙的な型変換を担う役割もあり、明示的に記述して呼び出すこともできます。例えば、floatからintへの変換、charからintへの変換などが代表的な使用例です。また、継承関係にあるクラス同士(基底クラスと派生クラス)のポインタ変換にも利用できます。
C言語風のキャスト((int)x のような書き方)と比べると、static_castは意図が明確になり、コンパイラによる型チェックも働くため、より安全で可読性の高いコードになります。
基本的な使用例
以下は、float型の値をint型に変換する例です。
#include <iostream>
using namespace std;
int main() {
float x = 4.26;
int y = x; // C言語風のキャスト
int z = static_cast<int>(x);
cout << "Value after casting: " << z;
}出力結果
Value after casting: 4
static_cast<int>(x)によって、小数点以下が切り捨てられ、整数値「4」が得られます。
無関係な型へのキャストはエラーになる
static_castは、互換性のない型同士の変換には使用できません。継承関係のないクラス間でポインタを変換しようとすると、コンパイル時にエラーが発生します。
#include <iostream>
using namespace std;
class Base {};
class Derived : public Base {};
class MyClass {};
int main() {
Derived* d = new Derived;
Base* b = static_cast<Base*>(d); // 継承関係があるため正常に動作
MyClass* x = static_cast<MyClass*>(d); // コンパイル時にエラーが発生
}出力結果
[Error] invalid static_cast from type 'Derived*' to type 'MyClass*'
このように、Derived*からBase*への変換は継承関係があるため問題なく動作しますが、無関係なMyClass*への変換は不正なstatic_castとしてコンパイルエラーとなります。
まとめ
static_castは、数値型同士の変換や継承関係のあるクラス間のポインタ変換など、コンパイル時に安全性が検証できる変換に適したキャストです。無関係な型への変換はコンパイラが検出してくれるため、C言語風のキャストよりも安全にコードを書くことができます。用途に応じてdynamic_castやconst_castなど他のキャスト演算子と使い分けることも重要です。
-
C++で解くリスのナッツ収集シミュレーション ― 最小移動距離を求めるアルゴリズム
問題概要 1本の木、1匹のリス、そして複数のナッツがフィールド上にあります。それぞれの位置は2次元グリッドのセルで表現されます。この問題の目的は、リスがすべてのナッツを集めて木の下に1個ずつ運ぶときの最小移動距離を求めることです。 リスの行動には次の制約があります。 一度に持てるナッツは最大1個 移動は上下左右の4方向で、隣接するセルへのみ可能 距離は移動回数(ステップ数)で表される たとえば、入力が「高さ: 5 / 幅: 7 / 木の位置: [2,2] / リスの位置: [4,4] / ナッツ: [[3,0], [2,5]]」の場合、出力は 12 となります。 解法のポイント まず、
-
C++で解く長方形エリアII ― 座標圧縮と走査線法による被覆面積の計算
問題概要 軸に平行な長方形のリストが与えられるものとします。各 rectangle[i] = {x1, y1, x2, y2} において、(x1, y1) は i 番目の長方形の左下隅の座標、(x2, y2) は右上隅の座標を表します。 求めたいのは、平面上でこれらすべての長方形が覆っている領域の合計面積です。答えは非常に大きな値になる可能性があるため、109 + 7 で割った余りを返すことになっています。 たとえば、入力が次のような場合を考えてみましょう。 このとき、出力は 6 となります。 解法の方針:座標圧縮+走査線(スイープライン) この問題は、座標圧縮(座標の離散化)と走査線法(