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
