C/C++ベース:constキーワードまとめ
5500 ワード
const
は比較的よく使われるキーワードで、ここではその使い方をまとめて、後で復習して整理して使う準備をします.総じて、
const
は、変数(基本データ型、ポインタ、参照、オブジェクト)、関数(一般関数、メンバー関数)の2つのクラスを修飾することができる.修飾変数
基本データ型の修飾
const int a = 3
のような変数の値を変更することを許さず、a
の値を変更するとconst
はタイプチェックの役割を果たすことができるconst
修飾変数は、ポインタによって変更できます.#include
int main()
{
volatile const int a = 3;
int *p = (int *)&a;
*p = 5;
printf("%d
", *p);
printf("%d
", a);
return 0;
}
g++
でコンパイルする場合は、volatile
を追加して修飾する必要があります(このキーワードの役割は、値を取るたびにメモリから取り出すことです).これはC++コンパイラが定数にアドレスを割り当てているが,使用時に直接即時数で置き換えられていることを示している.修飾ポインタ
int a = 1;
int b = 2;
//
const int *p1 = &a;
*p1 = 3; //
*p1 = &b; //
//
int const *p2 = &a;
*p2 = 3; //
*p2 = &b; //
//
int *const p3 = &a;
*p3 = 3; //
*p3 = &b; //
第1の表現は、第2の表現と同様に、ポインタ
p1
およびp2
によって変数a
の値を変更することはできない(ただし、a自身によって自分の値を変更することができる)第3の表現は、
p3
が他の変数を指すことを許さないことを意味する(const
がp3
を修飾し、p3
の内容が変更を許さず、p3
の値がa
のアドレスであると理解される).修飾参照
int a = 1;
const int &b = a;
b = 3; //
const
を加える修飾修飾関数
修飾一般関数
int global_a = 3;
//
const int* return_pointer()
{
int *a = &global_a;
return a;
}
//
const int return_value()
{
int a = 3;
return a;
}
int main
{
int *p1 = return_pointer(); //
const int *p2 = test(); //
int value1 = return_value(); //
const int value2 = return_value(); //
}
const
キーワードが関数の先頭に置かれると、戻り値が定数であることを表します.「ポインタ伝達」方式の関数戻り値に
const
を加算すると、関数戻り値の内容は変更されず、const修飾を加算した同型ポインタにのみ付与される.しかし、関数の戻り値が値伝達にすぎない場合、関数が変数に返す値は複製された一時的な変数であるため、
const
を加えて修飾することは意味がない.修飾メンバー関数
const
キーワード修飾メンバー関数の戻り値を修飾一般関数と同様に作用させる.ここでは説明を繰り返しません.class Test
{
public:
void func_const() const
{
a = 3; // ,
test(); // ,
}
void test()
{
cout << "hello" << endl;
}
private:
int a;
};
関数名の末尾にconst
を配置するのはメンバー関数特有のやり方で、通常の関数であればだめです.このような目的は、この関数内でデータ・メンバーの変更が許可されず、非常に多くのメンバー関数を呼び出すことができないことです.本質的にはthis
ポインタをconst
と宣言し、クラスA
をインスタンス化した後、test()
関数を呼び出し、this
ポインタを最初のパラメータとして伝えたが、このthis
ポインタのタイプはconst A *const this
であり、オブジェクト呼び出しメンバー関数の利用はthis
ポインタである.これは、定数メンバー関数で非常量メンバー関数を呼び出すことができない理由です(*const this
は*this
に変換できません).例えば、上記のtest()
関数は、呼び出し時に入力されるthis
ポインタのタイプがconst A *
であり、func_const()
が入力されるthis
ポインタのタイプがconst A *const
であり、func_const()
ではtest()
関数が呼び出され、const A *const
をconst A *
に変換できないことが明らかであるため、エラーが発生する. class Test
{
public:
//
void func() {};
void func() const {};
};