Introduction

忘備録。

今更すぎる内容だけど、きちんと意味を理解したいので書いておく。

Examples

const メンバー関数

関数内でクラスのメンバーを変更しないことを保証。
下記はコンパイルエラーになる。

1
2
3
4
5
6
7
8
9
10
class MyClass {
public:
int* get(int value) const
{
this->m_num = nullptr; // error: assignment of member ‘MyClass::m_num’ in read-only object
return this->m_num;
}
private:
int* m_num;
};

ポインタ型の前に const

ポインタが指し示す値を変更しないことを保証。
クラスの関数に使えば、オブジェクトのメンバーを外部による変更から守ることができる。
下記はコンパイルエラーになる。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class MyClass {
public:
const int* get()
{
return this->m_num;
}
private:
int* m_num;
};

int main()
{
MyClass* m = new MyClass();
const int* num = m->get();
*num = 0; // error: assignment of read-only location ‘* num’

return 0;
}

ポインタ型の後に const

ポインタのアドレスを変更しないことを保証。
下記はコンパイルエラーになる。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class MyClass {
public:
int* const get()
{
return this->m_num;
}
private:
int* m_num;
};

int main()
{
MyClass* m = new MyClass();
int* const num = m->get();
num = nullptr; // error: assignment of read-only variable ‘num’

return 0;
}

ポインタ型の前後に const

ポインタのアドレス及びポインタが指し示す値を変更しないことを保証。
下記はコンパイルエラーになる。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class MyClass {
public:
const int* const get()
{
return this->m_num;
}
private:
int* m_num;
};

int main()
{
MyClass* m = new MyClass();
const int* const num = m->get();
num = nullptr; // error: assignment of read-only variable ‘num’
*num = 0; // error: assignment of read-only location ‘*(const int*)num’

return 0;
}