C++ での Const Int と Int Const の違い

Shikha Chaudhary 2024年2月16日
  1. C++ での const intint const の違い
  2. C++ const キーワード
  3. 変数を使用した const int および int const
  4. const int および int const ポインタ付き
  5. C++ で int * const を使用する
  6. C++ で const int *を使用する
  7. まとめ
C++ での Const Int と Int Const の違い

プログラミング言語で最も愛され、トリッキーな質問は、プログラムの実行方法と出力に大きな違いをもたらす小さな変更である質問です。

この記事では、const int が C++ の int const と同じであるかどうかについて説明します。

C++ での const intint const の違い

コード:

int const a = 1000;
const int a = 1000;

ほぼ同じように見える 2 行のコードを次に示します。さて、これらの 2 行のコードは同じですか?

その質問に答える前に、C++ の const キーワードの基本をもう一度見てみましょう。

C++ const キーワード

C++ の const キーワードは、特定のものを一定に保つのに役立ちます。つまり、const キーワードを変数、ポインター、またはメソッドの前に置くと、プログラムの実行中にこれらの変数、ポインター、およびメソッドのデータ項目の値を変更できなくなります。

const キーワードで初期化された変数、ポインター、またはメソッドの値を変更しようとすると、エラーが発生します。

コード:

#include <iostream>
using namespace std;

int main() {
  const int demo = 1;  // constant variable
  cout << demo;
  demo = 2  // changing the value of constant variable
         cout
         << demo;
  return 0;
}

出力:

In function 'int main()': error: assignment of read-only variable 'demo'
    9 |     demo = 2
    |     ~~~~~^~~

上記の例では、const 変数 demo を宣言し、それに値 1 を割り当てます。次に、同じ定数変数に別の値 2 を割り当てます。

出力に示されているように、これによりエラーが発生します。

コード:

#include <iostream>
using namespace std;

int main() {
  int demo = 1;
  cout << "The initial value is: " << demo << endl;

  // changing the value of the variable
  demo = 2;

  cout << "The changed value is: " << demo << endl;
  return 0;
}

出力:

The initial value is: 1
The changed value is: 2

今回は、変数 demo をキーワード const で初期化しません。したがって、エラーを発生させることなく、この変数の値を変更できます。

これは基本的に、const キーワードの仕組みです。const キーワードの詳細については、このリンクを参照してください。

答えなければならなかった質問に戻りましょう。

変数を使用した const int および int const

C++ で const を変数に付加する標準的な方法は、変数のデータ型の前にこのキーワードを置くことです。ただし、変数自体の前に配置すると、同じ目的を果たし、同様に機能します。

これは、次のコード行が同等で正しいことを意味します。

const int demo = 1000;
int const demo = 1000;

そのような宣言を読むときの秘訣は、右から左に行くことです。したがって、コードの最初の行は次のように読み取られます。-demo は定数整数です。

2 行目は–demo は定数整数として読み取られます。言うまでもなく、これらのステートメントはどちらも同じ意味です。

これは、実際の例で確認できます。この次の例では、データ型の前にキーワード const、つまり int を配置してから、変数 demo を出力します。

コード:

#include <iostream>
using namespace std;

int main() {
  const int demo = 1000;  // const keyword before the data type
  cout << demo;
}

出力:

1000

変数 demo 自体の前に配置されたキーワード const で同じことを試してみましょう。

#include <iostream>
using namespace std;

int main() {
  int const demo = 1000;  // const keyword before the variable itself
  cout << demo;
}

出力:

1000

これらのステートメントが、エラーを発生させることなく同じように機能する方法を確認してください。定数変数を宣言する必要がある場合は、これらのステートメントのいずれかを使用できます。

したがって、int constconst int と同じであると結論付けることができますが、落とし穴があります。これは、ポインタが入らなくなるまで変数に当てはまります。

ポインタの場合、キーワード const の意味はその位置によって変わります。キーワード const がポインタでどのように機能するかについて説明しましょう。

const int および int const ポインタ付き

ポインタで const キーワードを使用するのは非常に簡単です。ポインタを不変にするか、コンテンツが不変を指すようにすることができます。

以下のコード行を見てください。ポインタ demo は、値を変更できない定数ポインタです。

これは、別の値または変数を指すように変更できないことを意味します。 –demo は整数への定数ポインタであるため、これを右から左に読みます。

int* const demo = &anyvalue;

ただし、以下に示すこの 2 番目のコードでは、ポインターdemo が指すデータを変更できません。これを次のように読みます。-demo は、定数である整数へのポインタです。

const int *demo = &anyvalue;

これらのコード行の両方を例を挙げて理解しましょう。

C++ で int * const を使用する

上記のように、ポインタ変数の前にキーワード const を配置すると、別の値または変数を指すようにポインタを変更できないことを意味します。これは、例を通してより深く見ることができます。

次のポイントは、以下のコードで何が起こっているかをまとめたものです。

  1. ここでは、最初に変数 one の値をポインター変数*demo に割り当てます。これは、ポインタ*demo が変数 one を指していることを意味します。
  2. 変数 one の値を出力すると、出力は 1 として取得され、demo を出力すると、それが指しているアドレスが取得されます。これは変数 one のアドレスです。
  3. 後で、別の変数 two を同じポインター変数 demo に割り当て、値を出力します。今回は、ポインタが別のアドレスを返します。

コード:

#include <iostream>
using namespace std;

int main() {
  int one = 1;
  int two = 2;
  int *demo = &one;  // demo pointer points to variable one

  cout << one << endl;
  cout << demo << endl;

  demo = &two;  // assigning the variable two to demo variable

  cout << two << endl;
  cout << demo << endl;

  return 0;
}

出力:

1
0x7ffc22e802a8
2
0x7ffc22e802ac

同じポインタ変数に異なる変数を割り当てる方法がわかります。ポインタ変数の前に const キーワードを付けると、この変更は不可能です。

コード:

#include <iostream>
using namespace std;

int main() {
  int one = 1;
  int two = 2;
  int* const demo = &one;  // attach const keyword before the pointer variable

  cout << one << endl;
  cout << demo << endl;

  demo = &two;  // this assignment will now give an error

  cout << two << endl;
  cout << demo << endl;

  return 0;
}

出力:

In function 'int main()': error: assignment of read-only variable 'demo'
   13 |     demo = &two;
      |     ~~~~~^~~~~~

今回は、宣言されたポインタが定数であるため、別の変数を割り当てることができないことに注意してください。したがって、エラーが発生します。

これは、ポインタとともに使用した場合の int const の意味です。

C++ で const int *を使用する

ポインタを使用して変数の値を変更できることはすでにわかっています。これを以下の例に示します。

次のポイントは、このコードで何が起こっているかをまとめたものです。

  1. 最初に値 1 を変数 one に割り当て、ポインター*demo が変数 one を指します。
  2. 次に、変数 one とポインター*demo の値を出力します。これらは両方とも 1 として出力を提供します。
  3. 後で、値 2 をポインタ変数*demo に割り当てます。
  4. 最後に、変数 one とポインターdemo の値を出力しますが、今回は両方とも 2 として出力を提供します。

コード:

#include <iostream>
using namespace std;

int main() {
  int one = 1;  // variable one holds the value 1
  int *demo = &one;

  cout << one << endl;
  cout << *demo << endl;

  *demo = 2;  // assign the value 2 to variable demo

  cout << one << endl;
  cout << *demo << endl;
}

出力:

1
1
2
2

変数が割り当てられたポインターを使用して、変数の値がどのように変化するかを確認します。現在、ポインタのデータ型の前に const キーワードを使用すると、この種の可変性は不可能になります。

コード:

#include <iostream>
using namespace std;

int main() {
  int one = 1;
  const int *demo = &one;  // attach const keyword before data type

  cout << one << endl;
  cout << *demo << endl;

  *demo = 2;  // this assignment will give an error now

  cout << one << endl;
  cout << *demo << endl;
}

出力:

In function 'int main()': error: assignment of read-only location '* demo'
   12 |     *demo = 2;
      |     ~~~~~~^~~

ポインタが指す変数の値を変更しようとすると、エラーが発生することに注意してください。これは、ポインタとともに使用した場合の const int の意味です。

まとめ

この記事では、const intint const の違いについて学びました。さらに、変数とポインターのコンテキストでそれらがどのように機能するかを確認しました。

また、これらの形式はどちらも単純な変数では同じ意味ですが、ポインターの意味が大幅に変わることも学びました。さまざまな実例を通じてこれを理解し、C++ の const キーワードの基本についても説明しました。

関連記事 - C++ Keyword