はじめに
C++を勉強していくとでてくる「const」というキーワード。これを使用するときに付け方に迷ったときはありませんか?例えば関数の戻り値につけて戻ってきた値やポインタに対して変更できなくするなど今回はconstの付け方に迷ったときにどうやってつければいいかまとめてみました。
constとは?
そもそもconstとは「データやオブジェクトが変更できないように指定する修飾子」です。変更されたくないデータの前にconstをつけるとそのデータは上書きなど変更ができなくなります。
int main()
{
const float pi = 3.141592f;
pi = 3.0f; // NG。上書き不可
}
constを使うメリット
constを使うメリットとしては具体的にはこんな感じです。
- 安全性の向上
- 可読性の向上
1番目は安全性の向上です。変数やポインタなどが間違って変更されなくなることで意味不明なバグやエラーを減らすことができます。
2番目は可読性の向上です。constをつけることによって「このデータは変更されない。または、変更してはいけないデータなんだな」ということを他のプログラマーに理解してもらいやすくなります。
constの付け方
なんとなくconstの良さがわかったところで付け方をまとめてみます。
変数の場合
const 非ポインタの場合
constのつけ方 | 値の変更 |
---|---|
const int | ✕ |
int const | ✕ |
非ポインタの場合は型名の前後どちらにつけても意味は変わらず、挙動は変わりません。
const ポインタの場合
constのつけ方 | 値の変更 | ポインタの変更 |
---|---|---|
const int* | ✕ | ◯ |
int* const | ◯ | ✕ |
const int* const | ✕ | ✕ |
int const* const | ✕ | ✕ |
ポインタの場合、constが*(ポインタ)の前後どちらについているかによって挙動が変わります。
constの前に*(ポインタ)がついている場合は値の変更はできません。(読み取り専用)ですが、値があるアドレスは変更できます。
constの後ろに*(ポインタ)がついている場合はアドレスの変更はできません。ですが、値の変更できます。
connstの前後に*(ポインタ)がついている場合は値、アドレス両方の変更ができません。
関数の場合
constのつけ方 | 受け取り側の値の変更 | 関数内での値の変更 |
---|---|---|
const int& Get() | ✕ | ◯ |
const int* Get() | ✕ | ◯ |
int Get() const | ◯ | ✕ |
const int* Get() const | ✕ | ✕ |
constを関数名の前後どちらにつけるかによってその関数の戻り値が変更可能か、関数内での値の変更が可能かどうか挙動が変わってきます。基本的にGet???()などなにかしら値を取得する関数は&やポインタを使用して参照して使うと思います。その関数を使う人がミスをしても大丈夫なように取得するデータが変更されたくない場合はconstをつけておきましょう。
まとめ
なんとなくconstのつけ方はわかったと思います。うまく使えるようになるとコードが見やすくなったり、デバッグがしやすくなったりするのでおすすめです。ぜひ使えるようになりましょう。