C++のメンバー関数における静的変数の仕組みと使い方を実例で解説
C++では、メンバー関数の中でもstaticキーワードを使って静的変数(static変数)を宣言できます。静的変数にはいくつか重要な特徴があります。
メンバー関数内の静的変数の特徴
- メモリ上の領域が割り当てられるのはプログラム実行中に1回だけであり、その領域はプログラム全体の終了まで保持されます。
- プログラム全体を見ても、その変数の実体(コピー)はただ1つしか存在しません。
- 明示的に初期化しない場合、整数型などの静的変数は自動的に0で初期化されます。
- オブジェクトごとに値が作られるのではなく、すべてのオブジェクト間で同じ変数が共有されます。
以下は、C++のメンバー関数内で静的変数を使う例を示すサンプルプログラムです。
サンプルコード
#include <iostream>
using namespace std;
class Base {
public :
int func() {
static int a;
static int b = 12;
cout << "The default value of static variable a is: " << a;
cout << "\nThe value of static variable b is: " << b;
}
};
int main() {
Base b;
b.func();
return 0;
}実行結果
このプログラムを実行すると、次のような出力が得られます。
The default value of static variable a is: 0 The value of static variable b is: 12
プログラムの解説
まず、クラスBaseのメンバー関数func()の中で、2つの静的変数aとbを宣言しています。aは明示的な初期化を行っていないためデフォルト値の0となり、bは12という値で初期化されています。そして、これらの値がcoutによって画面に表示されます。
該当するコード部分は以下の通りです。
class Base {
public :
int func() {
static int a;
static int b = 12;
cout << "The default value of static variable a is: " << a;
cout << "\nThe value of static variable b is: " << b;
}
};続いて、main()関数では、クラスBaseのオブジェクトbを生成し、そのメンバー関数func()を呼び出しています。該当するコード部分は以下の通りです。
int main() {
Base b;
b.func();
return 0;
}補足:呼び出し間で値が保持される
メンバー関数内の静的変数は、関数が終了しても値が破棄されず、次回以降の呼び出し時にも前回の値が引き継がれます。例えば、func()内でstatic int count = 0;としてcount++;を行うようにすれば、何度呼び出されても通算のカウントを記録できるため、関数の呼び出し回数の管理などに活用できます。これはローカル変数とは大きく異なる点であり、ローカル変数は関数を抜けるたびに破棄されるためです。
-
【初心者向け】C++の例外処理の仕組みを徹底解説!try・catch・throwの基本から独自例外の作成まで
C++における例外処理(Exception Handling)とは、プログラムの実行中に発生するエラー(ランタイムエラー)を適切に処理するための仕組みです。例外とは、実行時に送出されるイベントのことを指し、C++ではすべての標準例外が std::exception クラスを基底クラスとして定義されています。 もし例外を捕捉しなければ、プログラムは例外メッセージを出力した後に異常終了してしまいます。例外はハンドリング可能なランタイムエラーであり、適切に処理することでプログラムの堅牢性を大きく向上させることができます。 標準例外クラスの階層構造 C++標準では、例外は <exception&
-
JavaからC++関数を呼び出す方法!JNIを使ったネイティブメソッドの手順を解説
JavaからC++で実装された関数(ネイティブメソッド)を呼び出すには、JNI(Java Native Interface)という仕組みを利用します。ここでは、ネイティブメソッドを使用するための基本的な手順を順番に解説します。 ネイティブメソッドを使用する手順 C++プログラム用のヘッダーファイル(.hファイル)を作成するJDKに付属のjavac -hオプションなどを使い、Javaクラスから対応するヘッダーファイルを生成します。 C++ファイル(CPPファイル)を作成するヘッダーファイルで宣言された関数の実際の処理を、C++のソースファイルに実装します。 DLL(ダイナミックリンクライブラリ