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

C++のconst_castとは?定数キャストの使い方を実例で解説


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

const_castは、C++に用意された型キャスト演算子の一つです。オブジェクトの定数性(const指定)を変更するために使用され、言い換えれば、オブジェクトからconstの性質を取り除く役割を果たします。

たとえば、普段は定数として扱いたいものの、特定の場面でのみ値を書き換える必要があるオブジェクトが存在するプログラムでは、const_castが役立ちます。

構文

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

const_cast<型名>(式)

例1:const_castの基本的な使い方

まず、入力と出力の流れを見てみましょう。

入力: 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を代入し、さらにその変数「x」を指すint型の定数ポインタ「y」を宣言しています。

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

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

このようにして、const_castを使えば、定数値を50から100へと書き換えることができます。

逆に、const_castを使わずにポインタ「y」が指す先(変数「x」)の値を変更しようとすると、コンパイル時に次のようなエラーが表示されます。

read-only locationへの代入(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を使って、定数データを受け付けない関数に対して定数データを渡すこともできます。

例2:関数への定数データの受け渡し

#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()関数へ渡そうとした場合、エラーが発生します。

注意:本来constとして宣言されたオブジェクトそのものをconst_cast経由で書き換えると、C++標準規格では未定義動作となります。実際の開発では、const_castの使用は必要最低限にとどめ、設計段階でconst性を適切に管理することをおすすめします。


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

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

  2. C++のconstキーワードとは?定数宣言の基本とメリットを解説

    C++におけるconstは、変数を「定数」として宣言するための型修飾子です。const付きで宣言された変数は、一度初期化するとその値を後から変更することができません。 constを使うメリット constを使用する最大の利点は、プログラム内で値が意図せず書き換えられるのを防げることです。例えば、円周率(PI)のような不変の値を扱う場合、プログラムのどの部分からもその値が変更されないようにしたいはずです。このような値はconstとして宣言しておくことで、誤った代入から守ることができます。 コンパイラの最適化との関係 const修飾された型を持つオブジェクトは、コンパイラによって読み取り専用メ