【Cpp】const参照とconstポインタの違い

目次

constを変数につける場合

ローカル変数にconst修飾子をつけると、初期化時以降には値を変更できなくなります。

  • constをつける位置はの前と後どちらでも効果は同じです。
1
2
3
4
5
6
7
8
//  初期化時のみ値を設定できる
// constの位置は型の前と後でも意味は同じ
const int a = 10; // OK
int const b = 10; // OK

// 値の変更はできない
a = 12; // NG
b = 12; // NG
  • 変数宣言時に値を設定しないということもできません。
    1
    2
    const int a = 10; //  OK
    const int a; // NG

ポインタにconstをつける場合

ポインタにconst修飾子をつける場合、3通りの書き方があり、書き方によって定数にすることができるものが変わる

パターン1: const 型 * 変数名 = ポインタ

この場合、値は変更できないが、参照先は変更することができる

1
2
3
4
5
6
7
8
9
int a = 10;
const int *value = &a;

// 値の変更はできない
*value = 11; // NG

// 参照の付け替えはできる
int b = 11;
value = &b; // OK

パターン2: 型 * const 変数名 = ポインタ

この場合、値の変更はできるが、参照先は変更することができない

1
2
3
4
5
6
7
8
9
int a = 10;
int *const value = &a;

// 値の変更はできる
*value = 19; // OK

// 参照の付け替えはできない
int b = 19;
value = &b; // NG

パターン3: const 型 * const 変数名 = ポインタ

この場合、何も変更できないことになる。
パターン1で変更できなかったとパターン2で変更できなかった参照先どちらも変更できなくなる

1
2
3
4
5
6
7
8
9
int a = 10;
const int *const value = &a;

// 値の変更はできない
*value = 19; // NG

// 参照の付け替えはできない
int b = 19;
value = &b; // NG

constを参照につける場合

まず前提として、参照の場合はconstを&の後につけることはできない

  • 通常の変数のときと同じで、型の前後どちらにconstがあっても効果は同じ
    1
    2
    3
    4
    5
    6
    7
    int a = 10;

    const int &value = &a; // OK
    int const &value = &a; // OK

    // これだと、参照の参照を変更できない効果とかぶるので意味がない
    int& const value = &a; // NG

参照にconstをつけた場合、値の変更も参照の付け替え(これはデフォルト)もできなくなります。

1
2
3
4
5
6
7
8
int a = 10;
const int &value = a;

value = 19; // NG

// これは参照の基本機能でできない
int b = 19;
*value = &b; // NG
Author

Daiki Iijima

Posted on

2021-10-02

Updated on

2024-04-17

Licensed under