HOWTO · C++

C++ の Const メンバー関数

C++ での const メンバー関数の使用に関する記事。

このページの内容

この記事では、C++ での定数メンバー関数の使用について説明します。キーワード const を使用して、オブジェクト、変数、または関数を定数にします。

他の変数やオブジェクトと同様に、クラスのメンバー関数も const にすることができます。この記事では、このような機能に関する特定の規則と規制について説明します。

C++ の Const メンバー関数

Const は型修飾子であり、データが読み取り専用であることを示すデータ型で使用されるキーワードです。定数の宣言に使用できますが、Const は型の一部であるという点で他の言語の同等の構造とは異なり、ポインター、参照、複合データ型、および型チェックと組み合わせると複雑な動作をします。

Const メンバー関数は、プログラムで定数として宣言されています。これらの関数によって参照されるオブジェクトは変更できません。

オブジェクトへの意図しない変更を避けるために、const キーワードを使用することをお勧めします。どのオブジェクトでも const メンバー関数を呼び出すことができます。

non-const オブジェクトのみが non-const 関数を呼び出すことができます。クラスのオブジェクトを const オブジェクトとして宣言すると、const メンバー関数のみを呼び出すことができますが、non-const オブジェクトはすべてのメンバー関数 const または non-const を呼び出すことができます。

const 関数を作成するための構文は次のとおりです。

return -datatype function_name() const;

以下の例を考えてみましょう。

#include <iostream>
using namespace std;
class Data {
  int val;

 public:
  Data(int a = 0) { val = a; }
  int getValue() const { return val; }
};
int main() {
  Data d(10);
  cout << d.getValue();
  return 0;
}

このコードセグメントでは、コンストラクターとメンバー関数 getValue() を使用してクラス Data を宣言しました。この関数は const 関数であるため、データメンバーの値を変更することはできません。

データメンバーのデータを変更すると、コンパイラはエラーを生成します。この関数の this ポインターは、const メンバー関数に提供される const オブジェクトへのポインターです。

これにより、ポインタを使用してオブジェクトのデータメンバーを変更できないようになります。定数メソッドと呼ばれるオブジェクトのデータメンバーを変更しようとしたり、そのオブジェクトの non-const メンバー関数を呼び出そうとすると、構文エラーが発生します。

定数メンバー関数では、非定数バージョンがオーバーロードされる可能性があります。コンパイラは、const オブジェクトまたは non-const オブジェクトのどちらから呼び出されたかに基づいて、使用するバージョンを決定します。

Const コンストラクタとデストラクタを宣言することはできません。オブジェクト自体が一定であっても、常にデータメンバーを変更できます。

静的メンバー関数を const として定義することはできません。const キーワードは、メンバー関数に提供される this ポインター参照に影響しますが、静的メンバー関数は、オブジェクトなしで呼び出すことができるため、これはありません。

関数がクラス変数に書き込めないようにする const 関数の制限を緩和することもできます。これらのクラス変数は、関数が const 関数としてマークされている場合でも書き込み可能にするために、mutable キーワードでマークされています。

クラス変数が可変としてマークされ、const 関数がそれに書き込む場合、コードは正しくコンパイルされ、変数を変更できます(C++ 11)。

C++ ステートメントでの const キーワードの配置を変更すると、const キーワードを使用する場合によくあるように、完全に異なるセマンティクスがあります。前述の const の使用法は、const が括弧の後の関数宣言の最後に配置されている場合にのみ適用されます。