****
静的キーワード
- 1.メンバー変数を変更します
- 2.メンバーメソッドの変更
- 3.静的関数
- 4.静的グローバル変数
- 5.静的ローカル変数
1.メンバー変数を変更します
1)静的メンバー変数の初期化はクラスの外部に配置する必要があります
。2)静的メンバー変数はオブジェクトに属していませんが、クラス全体に属し、オブジェクト間で共有されます。各オブジェクトのメモリスペースを計算するとき、静的メンバー変数はカウントされません
。3)静的メンバー変数はクラス名を介してアクセスできます。
class A
{
public:
A(int ab)
{
this->m_ab = ab;
}
static int m_aa;
int m_ab;
};
int A::m_aa = 10; //静态成员变量的初始化必须放在类外
int main()
{
A a(10);
A::m_aa += 10; //可以通过类名访问静态成员变量
a.m_ab++;
cout << "aa: " << a.m_aa << "\tab: " << a.m_ab << endl; //计算每个对象的内存空间时,不算上静态成员变量
cout << "sizeof class A: " << sizeof(A) << endl;
}
上記のコードを実行する必要があります
// 2.変更されたメンバーメソッド(関数)
1)静的メンバーは互いにアクセスできます。静的メンバー関数は静的データメンバーと静的メンバー関数にアクセスできます
。2)非静的メンバー関数は静的メンバー関数と静的データメンバーに任意にアクセスできます
。3)静的メンバー関数は非静的メンバー関数にアクセスできません。静的メンバー関数静的メンバー関数と非静的データメンバー;
4)静的メンバー関数を呼び出すには、メンバーアクセス演算子(。)と(->)を使用して、クラスオブジェクトまたはクラスへのポインターの静的メンバー関数を呼び出すことができます。オブジェクト、またはクラスを使用できますName ::関数名の呼び出し(元々はクラスに属しているため、クラス名で呼び出すのが通常です)
5)静的データメンバーと同様に、静的メンバー関数はクラス全体に属します。特定のオブジェクトではなく、すべてのクラスにサービスを提供します。特定のクラスの特定のオブジェクト用ではないため、このポインターは使用できません。
class A
{
A(int b, char c)
{
this->m_b = b;
this->m_c = c;
}
//3.静态成员函数不能访问非静态成员函数和非静态数据成员;
static void GetVal(void)
{
cout << m_a << endl;
//cout << m_c << endl; //报错 :非静态成员引用必须与特定对象相对
//this->... //报错: this只能用于非静态函数内部
}
//2.非静态成员函数可以任意地访问静态成员函数和静态数据成员;
void getval(void)
{
cout << "m_a: " << m_a << "\tm_b: " << m_b << "\tm_c: " << m_c << endl;
}
private:
static int m_a;
int m_b;
char m_c;
};
int A::m_a = 100; //对静态成员初始化
3.静的関数
static void Stringprintf(string str) //用来表示不能被其它文件访问的函数
{
cout << str << endl;
}
// 4。静的グローバル変数
static string name = "gentle"; //用来表示不能被其它文件访问的全局变量
5.静的ローカル変数
静的ローカル変数の「メモリ」とライフタイムの「グローバル」
//记忆性:两次函数调用时,在第二次调用进入时,能保持第一次调用退出时的值。
void stafunc()
{
static int stanum = 0; //只有第一次进入该函数才会初始化
stanum++;
cout << "stanum: " << stanum << endl;
}
void func()
{
int num = 0;
num++;
cout << "num: " << num << endl;
}
int main()
{
for (int i = 0;i < 10;i++)
{
stafunc();
func(); //静态局部变量的函数和普通函数的对比
}
return 0;
}
示されているように、上記のコードの実行効果