C言語とc++のstaticまとめ

3005 ワード

C言語でのstatic
  • staticはグローバル変数を修飾し、変数のリンク属性を変更し、このグローバル変数がこのファイルにのみアクセスできるようにします.
  • staticは、ローカル変数を修飾し、ライフサイクルを長くし、その役割ドメインでのみ使用し、その役割ドメインを離れます.この変数は破棄されず、メモリに残っており、再びアクセスしても前回の変数の値であり、プログラムの実行が終了するまで解放されず、staticによって修飾された局所変数は静的領域記憶領域
  • に置かれる.
  • static修飾関数は、関数のリンク属性を変更し、本ファイルでのみ呼び出すことができ、他のファイルにアクセスすることはできません注意:静的変数は複数回付与できますが、
  • は1回のみ初期化できます.
    static  int a = 10;
      a = 20;
      int c = b;
      //  c   ? 10;
    

    c++のStatic
    人々は1つまたはいくつかのデータが1つのクラスのすべてのオブジェクトで共有されることを望んでいます.例えば、学生の属性は、自分の情報、成績などを含むだけでなく、クラスの学生の平均成績も望んでいます.この平均成績は、各オブジェクト(学生)が持っているもので、ある学生の属性だけではありません.平均成績をグローバル変数に設定できますが、安全ではなく、クラスの組立性を破壊するため、静的メンバーの概念を導入します.staticは変数と関数を修飾して変数のライフサイクルを変えることができます.
    
    class stu
    {
    public:
    static void shown();  //      
    ....
    private:static int num;  //      
    ...
    };
    
    //             
     int stu::num = 0;
    //           (   )  
    void stu:: shown()
    {
    ....
    }
    int main()
    {
    //             
    stu  s1;
    
    s1.shown(); //  1
    
    stu::shown() //  2
    
    //   ,           ,                 ,          
    return 0;
    }
    
    

    static修飾クラスメンバー変数
    static修飾メンバー変数:変数はクラス内で宣言され、クラス外で定義され、定義される場合、staticキーワードを追加する必要はありません.
    class student
    {
    public:	
          student(int n, char *nm, double s);  //    	
         ~student();  //    	
         void shown_infom();	
         void shown_count_sum();
    private:	
        int num; 	
        char *name;
       double score;	
        static int  count;   //      	
       static double sum;
    };
    
    //           
    int  student::count = 0;
    double student::sum = 0;
    
    //         
    student::student(int n, char *nm, double s)
    {	name = new char[strlen(nm) + 1];
    	num = n;	
    strcpy(name,nm);	
    score = s;
    count++;            //                   
    	sum += score;
    }
    
    //       
    student::~student()
    {  }
    void student::shown_infom()
    {	
    cout << num << " " << name << " " << score << endl;
    }
    
    void student::shown_count_sum()
    {	cout << count << " " << sum << endl;
    }
    
    int main()
    {
    	student st1(20160505, "bcr", 89.3);
    	st1.shown_infom();	
    	st1.shown_count_sum();	
        student st2(20160506, "lzk", 79.4);	
        st2.shown_infom();
       	st2.shown_count_sum();
    	system("pause");	
        return 0;
    }
    

    プロパティ(static修飾メンバー変数):
  • 静的メンバー(変数とメンバー関数を含む)は、すべてのクラスオブジェクトで共有され、オブジェクトに属しず、クラス属性です.
  • 静的メンバー変数はクラス外で初期化する必要があります.初期化時にstaticキーワードを追加しないと、関数初期化テーブルを再構築できません.
  • sizeof(オブジェクト)サイズには、静的メンバーは含まれません.

  • プロパティ(static修飾のメンバー関数)
  • 静的メンバー関数には非表示のthisポインタはありません.一般的には非静的メンバーにはアクセスできません(非静的には静的にアクセスできます)が、一般的なメンバーにはthisポインタがあります.オブジェクトのメンバー関数(非静的メンバー関数)を呼び出すと、オブジェクトの開始アドレスがメンバー関数のthisポインタに割り当てられます.オブジェクトのメンバー関数(非静的メンバー関数)を呼び出すと、オブジェクトの開始アドレスがメンバー関数のthisポインタに割り当てられます.ただし、静的メンバー関数はオブジェクトのメンバー関数ではなく、任意のオブジェクトには関係ありません.したがって、静的メンバー関数にはthisポインタはありません.
  • オブジェクトを指していない以上、オブジェクト内の非静的メンバーへのデフォルトアクセスはできません(つまり、データ・メンバーを参照するときにオブジェクト名を指定しません).
  • は、オブジェクト呼び出し:オブジェクトを使用することなく行うことができる.静的メンバー、タイプ:静的メンバー関数の名前
  • thisポインタがないのでconstで修飾できません.