C++ でポインタで const キーワードを使用する

胡金庫 2023年10月12日
  1. const キーワードを使用して、C++ の不変オブジェクトを示する
  2. C++ のポインタ型で const キーワードを使用する
C++ でポインタで const キーワードを使用する

この記事では、C++ でポインターを使用して const キーワードを使用する方法について説明します。

const キーワードを使用して、C++ の不変オブジェクトを示する

一般に、const キーワードは、指定されたオブジェクトがプログラムの実行中に不変であることを指定するために使用されます。定数値に名前を付ける方法は、リテラル値を直接指定する場合と比較して、コードベースをより調整可能で保守しやすいものにするのに役立ちます。さらに、const キーワードは、指定されたパラメーターが読み取り専用であることを示し、コンパイル時のエラーに対する実行時エラーを軽減するのに役立つために、関数インターフェイスによって非常に利用されています。

次のコードスニペットに示すように、型指定子の前にキーワードを含めることで、const オブジェクトを宣言します。ここでは、s1 変数が読み取り専用の文字列として作成されており、const オブジェクトに別の値を割り当てることができないことがわかります。したがって、宣言時に初期化する必要があります。const オブジェクトを変更しようとすると、コンパイラエラーがスローされます。

#include <iostream>

using std::cout;
using std::endl;
using std::string;

int main() {
  const string s1("Hello");
  string s2("Hello");

  //    s1 += "Joe"; // Error
  s2 += "Joe";

  cout << "s1: " << s1 << endl;
  cout << "s2: " << s2 << endl;

  return EXIT_SUCCESS;
}

出力:

s1: Hello
s2: HelloJoe

C++ のポインタ型で const キーワードを使用する

ポインタオブジェクトを宣言するときは、通常、ポイントされたオブジェクトのタイプも含めることに注意してください。そのため、宣言ステートメントのプレフィックスとして const キーワードを 1つだけ指定するのは難しいです。したがって、ポインタとポイントされたオブジェクト自体に別々の const 指定子を用意する必要があります。

一般に、これらの指定子には 3つの組み合わせがあります。最初の組み合わせでは、ポインターとオブジェクトの両方を変更できません。ポインタを再割り当てできないが、オブジェクト自体は変更可能である 2 番目の組み合わせ。最後に、ポインターが可変であり、オブジェクトが可変ではないバリアントがあります。

次のコードスニペットでは、対応する構文表記を示すために、3つのバリアントすべてが宣言されています。これらの宣言を右端の指定子から左に読むことをお勧めする場合もありますが、*const 宣言子が不変のポインターを示すために使用されることも覚えておいてください。

#include <iostream>

using std::cout;
using std::endl;
using std::string;

int main() {
  string s2("Hello");

  const string *const s3 = &s2;  // both are non-mutable
  s3 = &s2;                      // Error
  *s3 = s2;                      // Error

  const string *s4 = &s2;  // only string object is non-mutable
  s4 = s3;
  *s4 = s2;  // Error

  string *const s5 = &s2;  // only pointer is non-mutable
  s5 = s3;                 // Error
  *s5 = s2;

  return EXIT_SUCCESS;
}
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook

関連記事 - C++ Const