あなたが知らないC++の「穴」
2237 ワード
#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を出力する.このような細部に気づいたかどうか.
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ファイルにのみ表示されるため、他のファイルは衝突することなく同じ名前の変数を定義することができる.#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部しかなく、そのタイプのすべてのオブジェクト(派生クラスを含む)が共有されます.したがって、静的データ・メンバーの値は各オブジェクトに対して同じであり、その値は更新できます.
静的データメンバーは、グローバルデータ領域にメモリを割り当てる、本クラスに属するすべてのオブジェクトが共有するため、特定のクラスオブジェクトには属さず、クラスオブジェクトが生成する前に使用できる.