C++ の静的関数
この記事では、C++ でクラスの静的メンバー関数を使用する方法を示します。
static
メンバ関数を使って private
の static
メンバ変数にアクセスする
static
キーワードを C++ で使用して、特定のインスタンスではなく、クラス自体に関連付けられたクラスのメンバーを宣言できます。
静的メンバー変数はクラス本体内で宣言されますが、constexpr
修飾、const
修飾整数型、または const
修飾 enum
でない限り、同時に初期化することはできません。したがって、他のグローバル変数と同様に、クラス定義の外部で非定数静的メンバーを初期化する必要があります。
指定された静的メンバーに private
指定子がある場合でも、次のコードスニペットで BankAccount::rate
が初期化されるため、クラススコープ解決演算子を使用してグローバルスコープでアクセスできることに注意してください。プログラムの開始時に rate
メンバーが初期化されると、プログラムが終了するまで存続します。ユーザーが静的メンバーを明示的に初期化しない場合、コンパイラーはデフォルトの初期化子を使用します。
#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
using std::string;
class BankAccount {
private:
// static double rate = 2.2; / Error
static double rate;
double amount;
public:
explicit BankAccount(double n) : amount(n) {}
static double getRate() { return rate; }
static void setNewRate(double n) { rate = n; }
};
double BankAccount::rate = 2.2;
int main() {
BankAccount m1(2390.32);
BankAccount m2(1210.51);
return EXIT_SUCCESS;
}
BankAccount::rate
はすべての BankAccount
オブジェクトに保存されるわけではありません。BankAccount
クラスに関連付けられている rate
値は 1つだけであるため、すべてのインスタンスは指定された時点で同じ値にアクセスします。この動作はクラス設計で非常に役立ちますが、この場合、static
メンバー関数に焦点を当てます。
後者は通常、静的メンバー変数にアクセスするために使用されます。これは、クラスのユーザーが静的メンバー変数と対話するときにメンバーアクセス制御指定子が適用されるためです。
つまり、private
指定子を持つ rate
の値を取得する場合は、対応する public
メンバー関数が必要です。また、クラス自体の値は 1つしかないため、個々の呼び出しオブジェクトを使用してこれらのメンバーにアクセスする必要はありません。
そのため、静的メンバー関数である getRate
という名前の関数を実装し、rate
の値を返します。次に、BankAccount
タイプのオブジェクトを作成せずに、main
関数から rate
の値に直接アクセスできます。静的メンバー関数には、使用可能な this
暗黙的ポインターがなく、クラスの非静的メンバーにアクセス/変更できないことに注意してください。
#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
using std::string;
class BankAccount {
private:
static double rate;
double amount;
public:
explicit BankAccount(double n) : amount(n) {}
static double getRate() { return rate; }
static void setNewRate(double n) { rate = n; }
};
double BankAccount::rate = 2.2;
int main() {
cout << BankAccount::getRate() << endl;
BankAccount::setNewRate(2.4);
cout << BankAccount::getRate() << endl;
return EXIT_SUCCESS;
}
出力:
2.2
2.4