はじめに
定数メンバ関数(constメンバ関数)は、C++においてオブジェクトの状態を変更しないことを保証する関数です。これにより、オブジェクトの不変性を保ちながら、そのオブジェクトに関する情報を取得するための関数を提供できます。
これから定数メンバ関数について解説します。
基本構文
定数メンバ関数は、関数宣言の末尾にconst
キーワードを付けることで定義されます。
class MyClass {
public:
int getValue() const {
return value;
}
private:
int value;
};
特徴と利点
-
オブジェクトの状態を変更しない:
- 定数メンバ関数内では、メンバ変数の値を変更することができません。
- 他の非constメンバ関数を呼び出すこともできません(非constメンバ関数はオブジェクトの状態を変更する可能性があるため)。
-
constオブジェクトでの使用:
- 定数メンバ関数は、constオブジェクトやconst参照を通じて呼び出すことができます。非constメンバ関数はこれができません。
void printValue(const MyClass& obj) {
std::cout << obj.getValue() << std::endl; // getValue()はconstメンバ関数である必要がある
}
int main() {
MyClass obj;
printValue(obj);
return 0;
}
メンバ変数へのアクセス
定数メンバ関数内では、メンバ変数を変更することができませんが、読み取り専用でアクセスすることは可能です。
class MyClass {
public:
int getValue() const {
// valueを変更することはできない
return value;
}
void setValue(int v) {
value = v;
}
private:
int value;
};
メンバ関数のオーバーロード
定数メンバ関数と非constメンバ関数をオーバーロードすることもできます。これにより、constオブジェクトと非constオブジェクトに対して異なる処理を提供できます。
class MyClass {
public:
void print() const {
std::cout << "const print" << std::endl;
}
void print() {
std::cout << "non-const print" << std::endl;
}
};
int main() {
MyClass obj;
const MyClass constObj;
obj.print(); // "non-const print" が出力される
constObj.print(); // "const print" が出力される
return 0;
}
ミュータブル変数(mutable)
特定のメンバ変数が定数メンバ関数内でも変更可能である必要がある場合、mutable
キーワードを使ってその変数を宣言できます。これにより、その変数はconstの制約を受けません。
class MyClass {
public:
int getValue() const {
counter++; // mutableなので変更可能
return value;
}
private:
int value;
mutable int counter;
};
まとめ
定数メンバ関数は、オブジェクトの状態を変更しないことを保証する関数です。これにより、オブジェクトの不変性を保ちながら情報を取得するための手段を提供し、constオブジェクトやconst参照を通じて呼び出すことができます。また、mutable
キーワードを使用することで、特定のメンバ変数に対する変更を許可することも可能です。定数メンバ関数は、クラス設計において安全性と柔軟性を向上させるための重要なツールです。