静的変数static


静的変数は非常に重要な知識点であり、筆記試験の面接にかかわらず、高周波の試験点である.确かにとても重要で、ここで简単に総括して、そのCとC++の中の作用!!後で使うために!
変数のライフサイクルと役割ドメイン
静的変数は静的記憶方式に属し、その記憶空間はメモリ内の静的データ領域(静的記憶領域内に記憶手段を割り当てる)であり、この領域内のデータはプログラムの実行期間全体にわたってこれらの記憶空間を占有し続け(プログラムの実行期間全体にわたって解放されない)、そのメモリアドレスはプログラムの実行が終了するまで変わらないと考えられる.
(逆にauto自動変数、すなわち動的局所変数は、動的記憶カテゴリに属し、動的記憶空間を占め、関数呼び出しが終了すると解放される).
void show1()
{
	if(1)
	{
		static int b=1 ;
		//           ,     ;    ;
	}
//	printf("%d
",b++); // ; }

静的変数は、プログラムの実行中に常に存在するが、その役割ドメイン以外では使用できない.
#include <iostream>
using namespace std;
//               ,             ,       ,
//               。  ,                          ,           
void show()
{
	static int a =10;   a++; 	cout<<a<<endl;
}
int main()
{
	show();  	show();	 //cout<<a<<endl;
	//)                  ,              ,
	//                  。      ,          ,      。
	system("pause");
	return 0;
}

静的変数は、プログラムが実行される前に作成され、プログラムの実行中にずっと存在します.
いわゆる
静的記憶方式とは、プログラムの実行中に一定の記憶空間を割り当てる方式である
変数の格納方法は、「静的ストレージ」と「動的ストレージ」の2つに分けられます.
静的記憶変数は、通常、変数定義時に記憶ユニットを分割し、プログラム全体が終了するまで一定に保たれる.グローバル変数は、このようなストレージ方式に属します.
ダイナミックストレージ変数は、プログラム実行中に使用すると、ストレージユニットが割り当てられ、使用が完了するとすぐに解放されます.
典型的な例は関数の形式パラメータであり、関数定義時に行パラメータに記憶ユニットを割り当てず、関数が呼び出された場合にのみ割り当てられ、呼び出し関数が完了するとすぐに解放される.
Cにおける役割ドメイン及びライフサイクル関数ファイルプログラム
static int b; 1.静的変数の役割ドメインは変数定義時に存在する括弧であり、その他は使いにくく、定義されていないが、この変数はずっと存在する.2.ライフサイクルはプログラム全体である.3.静的グローバル変数は、変数を定義するソースファイル内でのみ有効であり、同じソースプログラムの他のソースファイルでは使用できない役割ドメインを制限します.静的グローバル変数の役割ドメインは1つのソースファイルに限られているため、そのソースファイル内の関数にのみ共通であるため、他のソースファイルでエラーが発生することを回避できます.局所変数を静的変数に変更すると,その格納方式が変更され,生存期間が変更される.グローバル変数を静的変数に変更すると,その役割ドメインが変更され,その使用範囲が制限される.そのためstaticという説明子が異なる場所で果たす役割は異なる.
C++でstaticで修飾されたメンバー変数、
1.静的メンバー関数と非静的メンバー関数の根本的な違いは、静的メンバー関数にはthisポインタがなく、静的メンバー関数には現在のオブジェクトを指すthisポインタが含まれており、このようなパラメータが隠されていることです.2.静的変数または関数はコンパイル時にすでに存在する.静的変数はクラス外で初期化する必要があります.3.マスターコメント「静的関数と静的変数はクラスのコンポーネントであり、クラスオブジェクトのコンポーネントではありません.クラス名::静的変数名」の形式で直接呼び出すことができます.4.静的関数で定義される変数は普通で、静的であるためにはキーワードstaticを付けなければならない.静的メンバー関数、インライン関数、友元関数、構造関数、虚関数として明記できません!
オブジェクト:無名オブジェクト、定数オブジェクト、ポインタオブジェクト、インスタンスオブジェクト;
例は次のとおりです.
#include <iostream>
using namespace  std;
struct student
{
	int num;
	char c;
};

class aa
{
public:
	static int num;          //      ;    ,    
	static student stu[2];  //       ;	
	int n;
	aa()
	{
		//num=100;  //              ,       ,            ,    ,    ;
	}

	static void show()  //       this  ;        ,   this     ;
	{  	
		//   static    ;
		cout<<num<<endl;
		int a ;//               ;        static   ;
		//cout<<n<<endl;  //      N      ;
		//                    ,  n     ,
	}
};

int aa::num=100;  //           ,num   ,       ;

student aa::stu[]={{1,'a'},{2,'b'}};
student aa::stu[2]={{1,'a'},{2,'b'}};
//             ;

int main()
{
// 	aa a ;
// 	cout<<a.num<<endl;  //a.num==aa::num     ,          ,          (aa)    (a),    a  aa   ;
	cout<<aa::num<<endl;  //              ;              ;
	cout <<sizeof (aa)<<endl;  //      ,     4;   int n,  1(  ,     )                ;
	//sizsof(aa)   aa     ,         ;
	aa b;
	b.num++;
	aa c;  //              ;
	//           ,         ,             ;		 
	cout<<c.num<<endl;//    ;
	cout<<aa::show<<endl;//         ;
	aa::show();  //      ;

	system("pause");
	return 0;
}

私は愚かで、ここまで悟って、感慨深くて、自分と一緒に勉強して、陋文は浅くて、見る者は大目に見ます.