静态成员就是在成员变量和成员函数前加上关键词static,成员静态成员。
静态成员分为:
静态成员变量 ---> 全局区
1)所有的对象共享同一份数据。
例如:对象A将静态成员变量修改为100,对象B访问这个静态成员变量就是100。
2)在编译阶段已经分配好内存空间。
在./运行之前,就已经确定好全局区的地址了。
3)类内声明,类外初始化。
静态成员变量必须有初始化值,不然没法使用它。
//静态成员变量 不属于某一个对象,所以所有的对象都共享同一份数据。
#include <iostream>
using namespace std;
//静态成员变量
/*
1)所有的对象共享同一份数据。
例如:对象A将静态成员变量修改为100,对象B访问这个静态成员变量就是100。
2)在编译阶段已经分配好内存空间。
在./运行之前,就已经确定好全局区的地址了。
3)类内声明,类外初始化。
静态成员变量必须有初始化值,不然没法使用它。
*/
class Person{
public:
//类内声明
static int m_A; //静态成员变量
private:
static int m_B;
};
//类外初始化
int Person::m_A = 100;
int Person::m_B = 50;
int main(int argc,char *argv[])
{
Person p1;
cout << "p1.m_A = " << p1.m_A << endl; //100
//cout << "p1.m_B = " << p1.m_B << endl; //静态成员变量也会受到权限的控制
Person p2;
cout << "p2.m_A = " << p2.m_A << endl; //100
p2.m_A = 200;
cout << "p2.m_A = " << p2.m_A << endl; //200
cout << "p1.m_A = " << p1.m_A << endl; //200
p1.m_A = 50;
cout << "p2.m_A = " << p2.m_A << endl;
//静态成员变量 不属于某一个对象,所以所有的对象都共享同一份数据。
//因此静态成员变量有两种访问方式:
//1. 通过对象去访问。
//Person p3;
//cout << "p3.m_A = " << p3.m_A << endl;
//2. 通过类名去访问静态成员变量。
//cout << "Person::m_A = " << Person::m_A << endl;
return 0;
}
静态成员函数 ---> 代码区
1)所有的对象都共享同一个函数。
2)静态成员函数只能访问静态成员变量。
#include <iostream>
using namespace std;
//静态成员函数
/*
1)所有的对象都共享同一个函数。
2)静态成员函数只能访问静态成员变量。
*/
class Person{
public:
static void func() //在函数头的前面加一个static就变成静态成员函数
{
//m_A = 100; //对 因为静态成员函数可以使用静态成员变量
//m_B = 100; //错 因为静态成员函数不可以使用非静态成员变量
cout << "static void func()的调用" << endl;
}
static int m_A; //静态成员变量 --> 全局区
int m_B; //非静态成员变量 --> 栈区
private:
static void func2()
{
cout << "static void func2()的调用" << endl;
}
};
int Person::m_A = 0;
int main(int argc,char *argv[])
{
//1. 所有的对象都共享同一个函数,所以也有两个方式可以访问。
//1)通过对象去访问。
//Person p;
//p.func();
//2)通过类名去访问。
//Person::func();
Person p;
p.func();
//p.func2(); //静态成员函数也会受到权限的干扰。
return 0;
}