あなたが知らないC++の「穴」

2237 ワード

  • 局所静的変数まず2つの例
  • を見る
    #include 
    
    void func(int i) {
      static int s = i++;
      std::cout << s << std::endl;
    }
    
    int main() {
      func(0);
      func(1);
      func(2);
      return 0;
    }
    

    単純にこのコードが何を出力していると思いますか?0,1,2?出力はともかく次のコードを見てみましょう
    #include 
    
    void func(int i) {
      static int s;
      s = i++;
      std::cout << s << std::endl;
    }
    
    int main() {
      func(0);
      func(1);
      func(2);
      return 0;
    }
    

    上の2つのコードに違いがありますか?実際、この2つのコードの出力結果はまったく違います.この2つのコードはいずれも局所静的変数を用いており,C++では局所静的変数は一度だけ初期化されているが,ここで何が分かったのかというと,何が分かったようだ.第1の書き方は、静的変数sが1回のみ初期化されるため、func(1)、func(2)はsを初期化せず、0,0,0を出力する.第2の書き方は、関数を呼び出すたびに静的変数を初期化するのではなく、値を割り当てるので、0,1,2を出力する.このような細部に気づいたかどうか.
  • グローバル静的変数
  • グローバル静的変数
  • はルールを非表示にします.最も重要なのは、複数のファイルを同時にコンパイルする場合、static接頭辞を付けていないすべてのグローバル変数と関数がグローバル可視性を持つことです.例を挙げて説明します.i.hファイル
  • int i = 9;
    

    main.cppファイル
    #include 
    #include "i.h"
    int main() {
      std::cout << i << std::endl;
    }
    

    i.hファイルのi変数は、すべてのファイルに表示されます.int i = 9;static int i = 9;に変更すればその隠し機能を発揮することができる、この場合main.cppのmain関数にi = 1;を追加すると、mainのため出力結果は1となる.cppのiはstatic iを隠す、静的変数iはi.hファイルにのみ表示されるため、他のファイルは衝突することなく同じ名前の変数を定義することができる.
  • デフォルト初期化0グローバル変数と同様に、初期化されていない静的変数は0に初期化されます.グローバル変数も静的データ領域
  • に格納されるからである.
  • 静的メンバー変数は、クラス内のメンバーの宣言の前にstaticを加える、クラスの静的データメンバーである.
  • #include 
    
    class MyClass{
    public:
         MyClass(int a,int b,int c);
         void Get();
    
    private:
        int a,b,c;
        static int sum;//        
    };
    
    int MyClass::sum=0;//            
    

    非静的データ・メンバーの場合、各クラス・オブジェクトには独自のコピーがあります.静的データ・メンバーはクラスのメンバーとして扱われ、このクラスがどれだけ定義されているかにかかわらず、静的データ・メンバーにはコピーが1部しかなく、そのタイプのすべてのオブジェクト(派生クラスを含む)が共有されます.したがって、静的データ・メンバーの値は各オブジェクトに対して同じであり、その値は更新できます.
    静的データメンバーは、グローバルデータ領域にメモリを割り当てる、本クラスに属するすべてのオブジェクトが共有するため、特定のクラスオブジェクトには属さず、クラスオブジェクトが生成する前に使用できる.
  • 静的メンバー関数
  • 通常のメンバー関数と比較して、静的メンバー関数は任意のオブジェクトに関連付けられていないため、thisポインタはありません.この意味では、クラスオブジェクトに属する非静的データ・メンバーにも非静的メンバー関数にもアクセスできず、他の静的メンバー関数のみを呼び出すことができ、アクセスするにはオブジェクトのみでアクセスできる場合、virtual、const、volatile関数として同時に宣言することはできません.