C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++のconst_castとは?型キャスト演算子の基本と使い方を徹底解説

この記事では、C++における const_cast の動作と使い方について詳しく解説します。

const_castとは

const_cast は、C++に用意されている型キャスト演算子の一つです。主な用途は、オブジェクトからconst(定数)性を取り除くことです。つまり、本来変更できないはずの定数オブジェクトを、あたかも書き換え可能なオブジェクトであるかのように扱えるようにします。

プログラムの中で「基本的には定数として扱いたいが、特定のタイミングでのみ値を変更したい」というオブジェクトがある場合に、const_cast が役立ちます。

構文

const_cast の構文は以下の通りです。

const_cast<型名>(式)

基本的な使用例

入力:
const int x = 50;
const int* y = &x;
cout << "old value is" << *y << "\n";
int* z = const_cast<int *>(y);
*z = 100;
cout << "new value is" << *y;

出力:
old value is 50
new value is 100

この例は、const_cast の最も基本的な使い方を示しています。まず、int型の定数変数「x」を宣言し、値として50を代入します。次に、同じくint型の定数ポインタ「y」を宣言し、変数「x」のアドレスを指させます。

const_cast を使うためには、3つ目のポインタが必要になります。ここでは同じデータ型であるint型のポインタ「z」を作成しました。

定数変数「x」を指している定数ポインタ「y」を const_cast に渡し、その結果をポインタ「z」に代入することで、定数ポインタ「y」が指す先の値を変更できるようになります。

このようにして、const_cast を使うことで定数の値を50から100へと変更することができました。

const_castを使わない場合のエラー

もし const_cast を使わずに、ポインタ「y」が指す先の値「x」を直接変更しようとすると、コンパイラは次のようなエラーを出力します。

assignment of read-only location(読み取り専用の場所への代入)

処理の手順

以下のプログラムでは、次のような流れで処理を行います。

  • まず、int型の定数変数を作成し、適切な値を設定します。ここでは変数名を「a」とし、値を20とします。
  • 次に、同じデータ型の定数ポインタ(ここでは「b」)を作成し、定数変数「a」のアドレスを割り当てます。
  • 続いて、const_cast のために使う3つ目のポインタ(ここでは「c」)をint型で作成します。
  • 定数ポインタ「b」を const_cast に渡し、その結果をポインタ「c」に代入します。
  • 最後に、ポインタ「c」の指す値を変更します。これにより、定数ポインタ「b」が指している先の値も自動的に変更されます。

アルゴリズム

開始
ステップ1 → main()関数内で
 定数int a = 20 を宣言
 定数ポインタ int* b = &a を宣言
 ポインタ int* c = const_cast<int *>(b) を宣言
 *c = 40 を代入
終了

サンプルコード

#include <iostream>
using namespace std;
int main() {
    const int a = 20;
    const int* b = &a;
    cout << "old value is" << *b << "\n";
    int* c = const_cast<int *>(b);
    *c = 40;
    cout << "new value is" << *b;
    return 0;
}

出力結果

上記のコードを実行すると、次の出力が得られます。

old value is 20
new value is 40

ここでは、値が20で不変のはずの定数変数「a」を、定数ポインタ「b」が指しています。しかし、同じデータ型の非定数ポインタ「c」を作成し、const_cast を適用することで、その定数値を変更することが可能になりました。

ポインタ「c」への値の変更により、定数ポインタ「b」が指していた定数値20が書き換わりました。const_cast を使う前の出力は20でしたが、使用後の出力は40になっています。

const_castのその他の用途

const_cast は、プログラム内で定数データを受け付けない関数に対して、定数データを渡したい場合にも利用できます。

サンプルコード

#include <iostream>
using namespace std;
int change(int* p2) {
    return (*p2 * 10);
}
int main() {
    const int num = 100;
    const int *p = &num;
    int *p1 = const_cast<int *>(p);
    cout << change(p1);
    return 0;
}

出力結果

上記のコードを実行すると、次の出力が得られます。

1000

このプログラムでは、const_cast を使うことで、定数データを受け付けない関数 change() に対して、定数値100を渡すことに成功しています。

change() 関数は受け取った値を10倍して返し、main() 関数がその結果を最終出力として表示します。つまり、出力は1000となります。

もし const_cast を使わずに、定数値を直接 change() 関数へ渡そうとすると、コンパイルエラーが発生します。

  1. C/C++の型キャストとは?基礎から整数昇格・通常の算術型変換まで解説

    型キャスト(型変換)とは、あるデータ型の変数を別のデータ型へ変換する手法のことです。例えば、long型の値を単純なint型の変数に格納したい場合、longをintへキャストすることができます。値をある型から別の型へ明示的に変換するには、キャスト演算子を次の形式で使用します。(型名) 式キャスト演算子の使用例次の例では、キャスト演算子によって整数変数同士の除算が浮動小数点演算として実行されます。#include <stdio.h> main() { int sum = 17, count = 5; double mean; mean = (double) su

  2. C++の関係演算子とは?種類と使い方を実例付きで解説

    C++プログラミングでは、2つの変数に格納された値を比較し、両者の大小関係や等価性を判定するために関係演算子を使用します。関係演算子は、if文などの条件分岐やfor文・while文などのループ処理において不可欠な要素であり、比較の結果はbool型(true / false)として返されます。C++で利用できる主な関係演算子は以下の通りです。演算子説明>より大きい(左辺が右辺より大きいか)>=以上(左辺が右辺以上か)<より小さい(左辺が右辺より小さいか)<=以下(左辺が右辺以下か)==等しい(左右の値が等しいか)!=等しくない(左右の値が異なるか)関係演算子の使い方これら