CとC++におけるstatic作用の詳細
1711 ワード
Cにおけるstaticの役割は大きく3つあります.
まずstaticの最も主要な機能は非表示であり、次にstatic変数が静的ストレージ領域に格納されるため、持続性とデフォルト値0を備えている.
分けて言えば:
(1)非表示この点は主に静的グローバル変数と静的関数についてである.非静的グローバル変数の役割ドメインは、ソースプログラム全体(複数のファイルを含む可能性がある)であり、静的グローバル変数は、その役割ドメインをこのファイルに限定します.同様に、静的関数もその役割ドメインを本ファイルに限定します.staticを使用して変数名と関数名の非表示を実現し、他のファイル内に相互に影響を及ぼさずに同名の関数または変数を持つことができます.static関数はメモリに1部しかなく、通常の関数は呼び出されるたびにコピーを維持します.
(2)持続性.主に静的局所変数に対して,局所変数を静的変数に変更した後,静的記憶領域に格納する,すなわちその生存期間を変更し,役割ドメインは変わらない.staticローカル変数は一度だけ初期化されます.
(3)デフォルト初期化は0です.グローバル変数はもともとデフォルトで0に初期化されているため、主に静的ローカル変数に対して使用されます.
C++におけるstaticの役割:
プロセス設計における互換性Cの特性に加えて、C++に追加された意味は、オブジェクト向けプログラム設計に現れる場合、staticは、このような特定のオブジェクトに属する変数および関数ではなく、クラスに属する変数および関数(Javaでこのキーワードの意味と同じ)を表す.具体的な状況は次のとおりです.
(1)クラスの静的メンバー変数
cppでは初期化する必要があります.
変数がstaticとして宣言されると、オブジェクトは実行スレッドで初めて定義に到達し、初期化されます.
出力:6 21
(2)クラスの静的関数を実現する場合もstaticの修飾は不要である.クラスの静的関数はこのクラスの範疇内のグローバル関数であり、クラスの静的メンバー(変数と関数)にアクセスするしかなく、クラスのインスタンスを必要とせずに呼び出すことができる.実際には、クラスのアクセス権を追加したグローバル関数です.
まずstaticの最も主要な機能は非表示であり、次にstatic変数が静的ストレージ領域に格納されるため、持続性とデフォルト値0を備えている.
分けて言えば:
(1)非表示この点は主に静的グローバル変数と静的関数についてである.非静的グローバル変数の役割ドメインは、ソースプログラム全体(複数のファイルを含む可能性がある)であり、静的グローバル変数は、その役割ドメインをこのファイルに限定します.同様に、静的関数もその役割ドメインを本ファイルに限定します.staticを使用して変数名と関数名の非表示を実現し、他のファイル内に相互に影響を及ぼさずに同名の関数または変数を持つことができます.static関数はメモリに1部しかなく、通常の関数は呼び出されるたびにコピーを維持します.
(2)持続性.主に静的局所変数に対して,局所変数を静的変数に変更した後,静的記憶領域に格納する,すなわちその生存期間を変更し,役割ドメインは変わらない.staticローカル変数は一度だけ初期化されます.
(3)デフォルト初期化は0です.グローバル変数はもともとデフォルトで0に初期化されているため、主に静的ローカル変数に対して使用されます.
C++におけるstaticの役割:
プロセス設計における互換性Cの特性に加えて、C++に追加された意味は、オブジェクト向けプログラム設計に現れる場合、staticは、このような特定のオブジェクトに属する変数および関数ではなく、クラスに属する変数および関数(Javaでこのキーワードの意味と同じ)を表す.具体的な状況は次のとおりです.
(1)クラスの静的メンバー変数
cppでは初期化する必要があります.
int Myclass::sum = 0; // , static
変数がstaticとして宣言されると、オブジェクトは実行スレッドで初めて定義に到達し、初期化されます.
//oop.h
#include<iostream>
using namespace std;
class Myclass
{
private:
int a , b , c;
static int sum; //
public:
Myclass(int a , int b , int c);
void GetSum();
};
//oop.cpp
#include "oop.h"
int Myclass::sum = 0; //
Myclass::Myclass(int a , int b , int c)
{
this->a = a;
this->b = b;
this->c = c;
sum += a+b+c;
}
void Myclass::GetSum()
{
cout<<"sum="<<sum<<endl;
}
int main(void)
{
Myclass M(1 , 2 , 3);
M.GetSum();
Myclass N(4 , 5 , 6);
N.GetSum();
M.GetSum();
getchar();
return 0;
}
出力:6 21
(2)クラスの静的関数を実現する場合もstaticの修飾は不要である.クラスの静的関数はこのクラスの範疇内のグローバル関数であり、クラスの静的メンバー(変数と関数)にアクセスするしかなく、クラスのインスタンスを必要とせずに呼び出すことができる.実際には、クラスのアクセス権を追加したグローバル関数です.