静的メンバー関数 C++ (例)
静的関数とは何か C++?
In C++ クラスでは、静的メンバーは、そのオブジェクトではなくクラスに属するクラス メンバーです。メンバーシップのコピーは 1 つだけあります。これは、作成するオブジェクトの数に関係なく当てはまります。
クラス関数が静的として定義されている場合、すべてのクラス オブジェクトは静的クラス メンバーを共有します。 したがって、静的関数はクラス オブジェクトを作成せずにアクセスでき、クラス オブジェクトから独立します。 クラスオブジェクト静的データメンバー C++ クラス外の静的関数にのみアクセスできます。
静的関数を使用する理由
取消 C++ グローバル関数とは異なり、静的関数は宣言ファイルからのみアクセスできます。関数へのアクセスを制限する必要がある場合は、関数を静的にします。
静的関数を使用して、別のファイルでの同じ関数名の再利用を制限します。
静的関数の定義 C++
構文:
static int myfunc(void) { cout("Example of C++ static function "); }
上の例では、myfunc という名前の静的関数を定義しています。 定義内で static キーワードが使用されていることに注意してください。 キーワードは関数名の前に置きます。
静的メンバー関数 C++
関数メンバーが静的として宣言されると、クラス内の他のオブジェクトから独立します。 他のクラス オブジェクトが存在しない場合でも、静的メンバー関数を呼び出すことができます。
クラス名にアクセスするには、クラス名とスコープ解決演算子を使用する必要があります。 (::)
。 静的関数は、他の静的関数、静的データ メンバー、およびクラス外の他の関数にのみアクセスできます。 静的メンバー関数のスコープはクラス内にあり、このクラス ポインターにはアクセスできません。
例
#include<iostream> using namespace std; class BoxClass { public: static int count; BoxClass(double l = 2.0, double b = 2.0, double h = 2.0) { cout << "Class constructor called." << endl; length = l; breadth = b; height = h; count++; } double getVolume() { return length * breadth * height; } static int getCount() { return count; } private: double length; double breadth; double height; }; int BoxClass::count = 0; int main(void) { cout << "Inital value of count is : " << BoxClass::getCount() << endl; BoxClass Box1(3.2, 1.4, 1.8); BoxClass Box2(7.5, 4.0, 4.0); cout << "Final value of count is : " << BoxClass::getCount() << endl; return 0; }
出力:
コードのスクリーンショットは次のとおりです。
コードの説明:
- iostreamヘッダーファイルを C++ プログラムを使用する 機能.
- std 名前空間を呼び出さずにそのクラスを使用するには、コードに std 名前空間を含めます。
- という名前のクラスを作成します Boxクラス。
- public アクセス修飾子を使用して、パブリックにアクセス可能なクラス メンバーをマークします。
- count という名前の静的クラス メンバーを宣言します。
- クラス コンストラクターを使用して、double 型の 3 つの変数を初期化します。
- コンソールにテキストを出力します。 endl (終了行) 関数は、マウス カーソルを次の行に移動します。
- l の値を可変長に初期化します。
- b の値を変数の幅に初期化します。
- h の値を変数の高さに初期化します。
- 次に、新しいオブジェクトが作成されるたびに、変数 count の値を 1 ずつ増やします。
- コンストラクター本体の終わり。
- doublevolume() という名前の関数を作成します。
- doubleVolume() 関数が返すものを定義します。長さ、幅、高さの変数の乗算を返す必要があります。
- doubleVolume() 関数本体の終了。
- getCount() という名前の静的関数を宣言します。
- getCount() 関数は count 変数の値を返す必要があります。
- getCount() 関数の本体の終わり。
- private アクセス修飾子を使用して、クラス メンバーをパブリックにアクセスできるものとしてマークします。
- double データ型の length という名前のクラス メンバーを宣言します。プライベートにアクセス可能になります。
- double データ型の broadth という名前の別のクラス メンバーを宣言します。これはプライベートにアクセス可能になります。
- double データ型の height という名前のクラス メンバーを宣言します。プライベートにアクセスできるようになります。
- 本体の端 Boxクラスクラス。
- 次に、静的メンバーを初期化します。 Boxクラスクラス。
- main()関数を呼び出します。 C++ プログラム ロジックはその関数の本体内に追加する必要があります。
- 新しいオブジェクトが作成される前に、現在のオブジェクト数を示すテキストをコンソールに出力します。
- という名前のオブジェクトを宣言します Box1、クラスのインスタンスの XNUMX つ Boxクラス。 幅、長さ、高さの値は括弧内に指定する必要があります。
- という名前のオブジェクトを宣言します Box2、クラスのインスタンスです Boxクラス。 幅、長さ、高さの値は括弧内に指定されています。
- 新しいオブジェクトの作成後に、現在のオブジェクト数を示すテキストをコンソールに出力します。
- 当学校区の C++ プログラム 正常に完了すると値を返す必要があります。
- 関数 main() の本体の終わり。
静的関数へのアクセス
静的関数にアクセスするためにクラスオブジェクトを作成する必要はありません。代わりに、クラス名とスコープ解決演算子を使用できます。 (::)
.
構文:
className::funcName
上記の className は、静的関数が定義されているクラスの名前です。 funcName は、静的関数に割り当てられた名前です。
例
#include<iostream> using namespace std; class MyClass { public: static void msgFunc() { cout << "Welcome to Guru99!"; } }; int main() { MyClass::msgFunc(); }
出力:
コードのスクリーンショットは次のとおりです。
コードの説明:
- iostream ヘッダー ファイルをプログラムに含めて、その機能を使用します。
- std 名前空間を呼び出さずにそのクラスを使用するには、コードに std 名前空間を含めます。
- MyClass という名前のクラスを作成します。
- public アクセス修飾子を使用して、クラス メンバーをパブリックにアクセスできるものとしてマークします。
- msgFunc() という名前の静的関数を宣言します。 static キーワードは関数を静的にします。
- 上記の関数が呼び出されたときにコンソールに出力するテキストを指定します。
- msgFunc() 関数の本体の終わり。
- クラス本体を終了します。
- main() 関数を呼び出します。
- msgFunc() という名前の静的関数を呼び出します。
- 関数 main() の本体の終わり。
静的変数へのアクセス
静的変数は、クラス オブジェクトではなくクラスに属します。静的変数がパブリックの場合、クラス名とスコープ解決演算子を使用してアクセスできます。ただし、静的メンバーがプライベートの場合、これは不可能です。
通常、プライベート変数にはパブリック関数を使用してアクセスします。 ただし、クラスのインスタンス/オブジェクトを作成する必要があります。 解決策は、静的関数を使用することです。
例3: 静的変数 C++ class
#include<iostream> using namespace std; class AClass { private: static int myvar; public: static int getVar() { return myvar; } }; int AClass::myvar = 23; int main() { cout <<"The value of myvar is: "<< AClass::getVar() << '\n'; }
出力:
コードのスクリーンショットは次のとおりです。
コードの説明:
- プログラムに iostream ヘッダー ファイルを含めます。
- 呼び出さずにそのクラスを使用するには、このプログラムに std 名前空間を含めます。
- AClass という名前のクラスを作成します。
- private アクセス修飾子を使用して、変数 myvar にプライベートにアクセスできるようにします。
- myvar という名前の静的整変数を作成します。
- 関数 getVar() をパブリックにアクセスできるものとしてマークする public アクセス修飾子を使用します。
- getVar() という名前の静的関数を作成します。
- getVar() 関数は変数 myvar の値を返すことができる必要があります。
- 関数 getVar() の本体の終わり。
- クラス AClass の本体の終わり。
- 変数 myvar に値 23 を割り当てます。これには、クラス名とスコープ解決演算子を使用しました。
- main() 関数を呼び出します。
- 変数 myVar の値を他のテキストと一緒にコンソールに出力します。この変数の値にアクセスするために、クラス名、静的関数、およびスコープ解決演算子を使用しました。
- main() 関数本体の終わり。
静的関数の this ポインター
静的関数はオブジェクトに付加されません。 そのため、静的関数にはこのポインターがありません。 オブジェクトのポインタは通常、現在作業中のオブジェクトを指します。 静的関数はオブジェクトでは機能しないため、このポインターは必要ありません。
静的関数は、他の静的メンバーに直接アクセスできます。 ただし、静的メンバーがいない場合はこの限りではありません。 その理由は、非静的メンバーはオブジェクトに属している必要があるが、静的関数には操作するオブジェクトがないためです。
例
クラス宣言の外で静的関数を定義することができます。 これを実証してみましょう:
#include<iostream> using namespace std; class NumGenerator { private: static int nextNum; public: static int getNextNum(); }; int NumGenerator::nextNum = 1; int NumGenerator::getNextNum() { return nextNum++; } int main() { for (int count = 0; count < 5; ++count) std::cout << "The next number is: " << NumGenerator::getNextNum() << '\n'; return 0; }
出力:
コードのスクリーンショットは次のとおりです。
コードの説明:
- iostream ヘッダー ファイルをコードに含めて、その機能を使用します。
- std 名前空間をコードに含めると、そのクラスを呼び出さずに使用できます。
- Num という名前のクラスを作成しますGenerator.
- private アクセス修飾子を使用して変数をマークし、プライベートにアクセスできるものとして作成しようとしています。
- nextNum という名前の静的整変数を作成します。
- public アクセス修飾子を使用すると、これから作成する変数をパブリックにアクセスできるものとしてマークするのに役立ちます。
- getNextNum() という名前の静的関数を宣言します。
- クラス本体の終了。
- 変数 nextNum に値 1 を割り当てます。これは、クラス名、変数名、およびスコープ解決演算子を使用して実行しました。
- getNextNum() 静的関数をクラスの外で定義します。
- 上記の関数が呼び出されたときに実行されるアクションを指定します。 変数 nextNum の値が 1 ずつ増加します。
- 関数 getNextNum() の定義の終わり。
- main()関数を呼び出します。 C++ プログラム ロジックはこの関数の本体内に追加する必要があります。
- 使用 forループ count という名前の変数を作成します。 この変数の値は 0 から 4 まで増加する必要があります。反復のたびに、変数の値は 1 ずつ増加します。
- 各反復で変数 nextNum の値を他のテキストと一緒にコンソールに出力します。 この値には、getNextNum() 関数を使用してアクセスします。
- この C++ プログラムは正常に完了すると値を返す必要があります。
- main() 関数の終わり。
製品概要
- C++ 静的メンバーは、オブジェクトではなくクラスに属するクラス メンバーです。
- 作成するオブジェクトの数に関係なく、静的メンバーのコピーは XNUMX つだけ存在します。
- すべてのクラス オブジェクトは、各静的クラス メンバーを共有します。
- クラス関数を静的として定義すると、その関数はクラス オブジェクトから独立します。
- クラス オブジェクトを作成しなくても、静的関数にアクセスできます。
- ただし、静的関数には、クラス オブジェクトを指すこのオブジェクトがありません。