C++クラスのメンバ関数宣言の末尾にある「const」の意味とは?
C++のコードを読んでいると、メンバ関数の宣言や定義の最後に「const」キーワードが付けられていることがあります。これはいったい何を意味するのでしょうか?
関数宣言の末尾に「const」を付けると、その関数は定数メンバ関数(constメンバ関数)として定義されます。定数メンバ関数とは、呼び出し元のオブジェクトの状態(メンバ変数)を変更できない関数のことです。つまり、関数内でメンバ変数への代入や変更を行うとコンパイルエラーになります。
オブジェクトの状態を変更しない参照専用の関数には、積極的にconstを付けることが推奨されています。これにより、コードの意図が明確になり、コンパイラによる誤用のチェックも受けられるようになります。
定数メンバ関数の例
次の例では、getVal()関数にconstを付けて定義しています。コメントアウトされた行のように、関数内でメンバ変数valueを書き換えようとすると、コンパイル時エラーが発生します。
#include<iostream>
using namespace std;
class MyClass {
int value;
public:
MyClass(int val = 0) {
value = val;
}
int getVal() const {
// value = 10; 【この行はconst関数内での値変更になるため、コンパイルエラーが発生する】
return value;
}
};
出力
The value is: 80
constオブジェクトから呼び出せる関数の制限
定数メンバ関数に関連して、もう一つ重要なポイントがあります。const付き・なしに関わらず、通常のオブジェクトからは定数メンバ関数を自由に呼び出せます。しかし逆に、constオブジェクトから呼び出せるのは定数メンバ関数だけです。const修飾されていないメンバ関数は、オブジェクトの状態を変更する可能性があるため、constオブジェクトからは呼び出せません。
次の例では、getVal()からconstを外した状態で、constオブジェクトから呼び出そうとしています。この場合、コンパイルエラーになります。
#include<iostream>
using namespace std;
class MyClass {
int value;
public:
MyClass(int val = 0) {
value = val;
}
int getVal(){
return value;
}
};
main() {
const MyClass ob(80);
cout<< "The value is: " << ob.getVal();
}
出力
[Error] passing 'const MyClass' as 'this' argument of 'int MyClass::getVal()' discards qualifiers [-fpermissive]
まとめ
- メンバ関数宣言の末尾に付く「const」は、その関数がオブジェクトのメンバ変数を変更しないことを保証する。
- 定数メンバ関数内でメンバ変数を書き換えると、コンパイルエラーになる。
- constオブジェクトから呼び出せるのは、const修飾されたメンバ関数のみ。
- メンバ変数を変更しない関数には常にconstを付けることで、より安全で読みやすいコードになる。
-
C++でconst修飾子を使う理由とは?定数宣言のメリットをわかりやすく解説
const修飾子とは何か C++におけるconst修飾子は、変数を「定数」として宣言するためのキーワードです。constを付けて宣言された変数は、一度初期化した後は値を変更できません。つまり、プログラムの実行中にその値が書き換わることはありません。 constを使う大きなメリット constを使用することには、非常に大きな利点があります。例えば、円周率(PI)のような変更されるべきではない定数値を扱う場合、プログラムのどこかで誤って値が上書きされてしまうと、計算結果全体に深刻な影響を及ぼしかねません。 そこで、PIのような重要な定数はconstとして宣言しておくことで、意図しない代入や変更から
-
C++のconstキーワードとは?定数宣言の基本とメリットを解説
C++におけるconstは、変数を「定数」として宣言するための型修飾子です。const付きで宣言された変数は、一度初期化するとその値を後から変更することができません。 constを使うメリット constを使用する最大の利点は、プログラム内で値が意図せず書き換えられるのを防げることです。例えば、円周率(PI)のような不変の値を扱う場合、プログラムのどの部分からもその値が変更されないようにしたいはずです。このような値はconstとして宣言しておくことで、誤った代入から守ることができます。 コンパイラの最適化との関係 const修飾された型を持つオブジェクトは、コンパイラによって読み取り専用メ