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;
}